题目描述
给定一个 正整数 n
。
如果一个整数 k
中的 偶数 位数与 奇数 位数相等,那么我们称 k
为公平整数。
返回 大于或等于 n
的 最小 的公平整数。
示例 1:
输入: n = 2
输出: 10
解释: 大于等于 2 的最小的公平整数是 10。
10是公平整数,因为它的偶数和奇数个数相等 (一个奇数和一个偶数)。
示例 2:
输入: n = 403
输出: 1001
解释: 大于或等于 403 的最小的公平整数是 1001。
1001 是公平整数,因为它有相等数量的偶数和奇数 (两个奇数和两个偶数)。
提示:
解法
方法一:分类讨论
我们记 $n$ 的位数为 $k$,奇数位数、偶数位数分别为 $a$ 和 $b$。
- 若 $a=b$,则 $n$ 本身就是
fair
的,直接返回 $n$ 即可;
- 否则,若 $k$ 为奇数,那么我们找到 $k+1$ 位的最小
fair
数即可,形如 10000111
;若 $k$ 为偶数,我们直接暴力递归 closestFair(n+1)
即可。
时间复杂度 $O(\sqrt{n} \times \log_{10} n)$。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 | class Solution:
def closestFair(self, n: int) -> int:
a = b = k = 0
t = n
while t:
if (t % 10) & 1:
a += 1
else:
b += 1
t //= 10
k += 1
if k & 1:
x = 10**k
y = int('1' * (k >> 1) or '0')
return x + y
if a == b:
return n
return self.closestFair(n + 1)
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27 | class Solution {
public int closestFair(int n) {
int a = 0, b = 0;
int k = 0, t = n;
while (t > 0) {
if ((t % 10) % 2 == 1) {
++a;
} else {
++b;
}
t /= 10;
++k;
}
if (k % 2 == 1) {
int x = (int) Math.pow(10, k);
int y = 0;
for (int i = 0; i < k >> 1; ++i) {
y = y * 10 + 1;
}
return x + y;
}
if (a == b) {
return n;
}
return closestFair(n + 1);
}
}
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28 | class Solution {
public:
int closestFair(int n) {
int a = 0, b = 0;
int t = n, k = 0;
while (t) {
if ((t % 10) & 1) {
++a;
} else {
++b;
}
++k;
t /= 10;
}
if (a == b) {
return n;
}
if (k % 2 == 1) {
int x = pow(10, k);
int y = 0;
for (int i = 0; i < k >> 1; ++i) {
y = y * 10 + 1;
}
return x + y;
}
return closestFair(n + 1);
}
};
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25 | func closestFair(n int) int {
a, b := 0, 0
t, k := n, 0
for t > 0 {
if (t%10)%2 == 1 {
a++
} else {
b++
}
k++
t /= 10
}
if a == b {
return n
}
if k%2 == 1 {
x := int(math.Pow(10, float64(k)))
y := 0
for i := 0; i < k>>1; i++ {
y = y*10 + 1
}
return x + y
}
return closestFair(n + 1)
}
|