Skip to content

Commit 2af5b14

Browse files
committed
feat: add solutions to lc problem: No.2081
No.2081.Sum of k-Mirror Numbers
1 parent a7a652d commit 2af5b14

File tree

7 files changed

+548
-25
lines changed

7 files changed

+548
-25
lines changed

solution/2000-2099/2081.Sum of k-Mirror Numbers/README.md

Lines changed: 193 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -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
95136
class 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

Comments
 (0)