@@ -85,26 +85,112 @@ tags:
8585
8686<!-- solution:start -->
8787
88- ### 方法一
88+ ### 方法一:折半枚举 + 数学
89+
90+ 对于一个 k 镜像数字,我们可以将其分为两部分:前半部分和后半部分。对于偶数长度的数字,前半部分和后半部分完全相同;对于奇数长度的数字,前半部分和后半部分相同,但中间的数字可以是任意数字。
91+
92+ 我们可以通过枚举前半部分的数字,然后根据前半部分构造出完整的 k 镜像数字。具体步骤如下:
93+
94+ 1 . ** 枚举长度** :从 1 开始枚举数字的长度,直到找到满足条件的 k 镜像数字。
95+ 2 . ** 计算前半部分的范围** :对于长度为 $l$ 的数字,前半部分的范围是 $[ 10^{(l-1)/2}, 10^{(l+1)/2})$。
96+ 3 . ** 构造 k 镜像数字** :对于每个前半部分的数字 $i$,如果长度为偶数,则直接将 $i$ 作为前半部分;如果长度为奇数,则将 $i$ 除以 10 得到前半部分。然后将前半部分的数字反转并添加到后半部分,构造出完整的 k 镜像数字。
97+ 4 . ** 检查 k 镜像数字** :将构造出的数字转换为 k 进制,检查其是否是回文数。
98+ 5 . ** 累加结果** :如果是 k 镜像数字,则将其累加到结果中,并减少计数器 $n$。当计数器 $n$ 减至 0 时,返回结果。
99+
100+ 时间复杂度主要取决于枚举的长度和前半部分的范围。由于 $n$ 的最大值为 30,因此在实际操作中,枚举的次数是有限的。空间复杂度 $O(1)$,因为我们只使用了常数级别的额外空间。
89101
90102<!-- tabs:start -->
91103
104+ #### Python3
105+
106+ ``` python
107+ class Solution :
108+ def kMirror (self , k : int , n : int ) -> int :
109+ def check (x : int , k : int ) -> bool :
110+ s = []
111+ while x:
112+ s.append(x % k)
113+ x //= k
114+ return s == s[::- 1 ]
115+
116+ ans = 0
117+ for l in count(1 ):
118+ x = 10 ** ((l - 1 ) // 2 )
119+ y = 10 ** ((l + 1 ) // 2 )
120+ for i in range (x, y):
121+ v = i
122+ j = i if l % 2 == 0 else i // 10
123+ while j > 0 :
124+ v = v * 10 + j % 10
125+ j //= 10
126+ if check(v, k):
127+ ans += v
128+ n -= 1
129+ if n == 0 :
130+ return ans
131+ ```
132+
92133#### Java
93134
94135``` java
95136class Solution {
96137 public long kMirror (int k , int n ) {
97138 long ans = 0 ;
98- for (int l = 1 ;; ++ l ) {
139+ for (int l = 1 ;; l ++ ) {
99140 int x = (int ) Math . pow(10 , (l - 1 ) / 2 );
100141 int y = (int ) Math . pow(10 , (l + 1 ) / 2 );
101142 for (int i = x; i < y; i++ ) {
102143 long v = i;
103- for (int j = l % 2 == 0 ? i : i / 10 ; j > 0 ; j /= 10 ) {
144+ int j = (l % 2 == 0 ) ? i : i / 10 ;
145+ while (j > 0 ) {
146+ v = v * 10 + j % 10 ;
147+ j /= 10 ;
148+ }
149+ if (check(v, k)) {
150+ ans += v;
151+ n-- ;
152+ if (n == 0 ) {
153+ return ans;
154+ }
155+ }
156+ }
157+ }
158+ }
159+
160+ private boolean check (long x , int k ) {
161+ List<Integer > s = new ArrayList<> ();
162+ while (x > 0 ) {
163+ s. add((int ) (x % k));
164+ x /= k;
165+ }
166+ for (int i = 0 , j = s. size() - 1 ; i < j; ++ i, -- j) {
167+ if (! s. get(i). equals(s. get(j))) {
168+ return false ;
169+ }
170+ }
171+ return true ;
172+ }
173+ }
174+ ```
175+
176+ #### C++
177+
178+ ``` cpp
179+ class Solution {
180+ public:
181+ long long kMirror(int k, int n) {
182+ long long ans = 0;
183+ for (int l = 1;; ++l) {
184+ int x = pow(10, (l - 1) / 2);
185+ int y = pow(10, (l + 1) / 2);
186+ for (int i = x; i < y; ++i) {
187+ long long v = i;
188+ int j = (l % 2 == 0) ? i : i / 10;
189+ while (j > 0) {
104190 v = v * 10 + j % 10;
191+ j /= 10;
105192 }
106- String ss = Long . toString(v, k);
107- if (check(ss. toCharArray())) {
193+ if (check(v, k)) {
108194 ans += v;
109195 if (--n == 0) {
110196 return ans;
@@ -114,14 +200,113 @@ class Solution {
114200 }
115201 }
116202
117- private boolean check (char [] c ) {
118- for (int i = 0 , j = c. length - 1 ; i < j; i++ , j-- ) {
119- if (c[i] != c[j]) {
203+ private:
204+ bool check(long long x, int k) {
205+ vector<int > s;
206+ while (x > 0) {
207+ s.push_back(x % k);
208+ x /= k;
209+ }
210+ for (int i = 0, j = s.size() - 1; i < j; ++i, --j) {
211+ if (s[ i] != s[ j] ) {
120212 return false;
121213 }
122214 }
123215 return true;
124216 }
217+ };
218+ ```
219+
220+ #### Go
221+
222+ ```go
223+ func kMirror(k int, n int) int64 {
224+ check := func(x int64, k int) bool {
225+ s := []int{}
226+ for x > 0 {
227+ s = append(s, int(x%int64(k)))
228+ x /= int64(k)
229+ }
230+ for i, j := 0, len(s)-1; i < j; i, j = i+1, j-1 {
231+ if s[i] != s[j] {
232+ return false
233+ }
234+ }
235+ return true
236+ }
237+
238+ var ans int64 = 0
239+ for l := 1; ; l++ {
240+ x := pow10((l - 1) / 2)
241+ y := pow10((l + 1) / 2)
242+ for i := x; i < y; i++ {
243+ v := int64(i)
244+ j := i
245+ if l%2 != 0 {
246+ j = i / 10
247+ }
248+ for j > 0 {
249+ v = v*10 + int64(j%10)
250+ j /= 10
251+ }
252+ if check(v, k) {
253+ ans += v
254+ n--
255+ if n == 0 {
256+ return ans
257+ }
258+ }
259+ }
260+ }
261+ }
262+
263+ func pow10(exp int) int {
264+ res := 1
265+ for i := 0; i < exp; i++ {
266+ res *= 10
267+ }
268+ return res
269+ }
270+ ```
271+
272+ #### TypeScript
273+
274+ ``` ts
275+ function kMirror(k : number , n : number ): number {
276+ function check(x : number , k : number ): boolean {
277+ const s: number [] = [];
278+ while (x > 0 ) {
279+ s .push (x % k );
280+ x = Math .floor (x / k );
281+ }
282+ for (let i = 0 , j = s .length - 1 ; i < j ; i ++ , j -- ) {
283+ if (s [i ] !== s [j ]) {
284+ return false ;
285+ }
286+ }
287+ return true ;
288+ }
289+
290+ let ans = 0 ;
291+ for (let l = 1 ; ; l ++ ) {
292+ const x = Math .pow (10 , Math .floor ((l - 1 ) / 2 ));
293+ const y = Math .pow (10 , Math .floor ((l + 1 ) / 2 ));
294+ for (let i = x ; i < y ; i ++ ) {
295+ let v = i ;
296+ let j = l % 2 === 0 ? i : Math .floor (i / 10 );
297+ while (j > 0 ) {
298+ v = v * 10 + (j % 10 );
299+ j = Math .floor (j / 10 );
300+ }
301+ if (check (v , k )) {
302+ ans += v ;
303+ n -- ;
304+ if (n === 0 ) {
305+ return ans ;
306+ }
307+ }
308+ }
309+ }
125310}
126311```
127312
0 commit comments