@@ -85,26 +85,112 @@ tags:
85
85
86
86
<!-- solution:start -->
87
87
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)$,因为我们只使用了常数级别的额外空间。
89
101
90
102
<!-- tabs:start -->
91
103
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
+
92
133
#### Java
93
134
94
135
``` java
95
136
class Solution {
96
137
public long kMirror (int k , int n ) {
97
138
long ans = 0 ;
98
- for (int l = 1 ;; ++ l ) {
139
+ for (int l = 1 ;; l ++ ) {
99
140
int x = (int ) Math . pow(10 , (l - 1 ) / 2 );
100
141
int y = (int ) Math . pow(10 , (l + 1 ) / 2 );
101
142
for (int i = x; i < y; i++ ) {
102
143
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) {
104
190
v = v * 10 + j % 10;
191
+ j /= 10;
105
192
}
106
- String ss = Long . toString(v, k);
107
- if (check(ss. toCharArray())) {
193
+ if (check(v, k)) {
108
194
ans += v;
109
195
if (--n == 0) {
110
196
return ans;
@@ -114,14 +200,113 @@ class Solution {
114
200
}
115
201
}
116
202
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] ) {
120
212
return false;
121
213
}
122
214
}
123
215
return true;
124
216
}
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
+ }
125
310
}
126
311
```
127
312
0 commit comments