You are given a positive integer n
.
We call an integer k
fair if the number of even digits in k
is equal to the number of odd digits in it.
Return the smallest fair integer that is greater than or equal to n
.
Example 1:
Input: n = 2 Output: 10 Explanation: The smallest fair integer that is greater than or equal to 2 is 10. 10 is fair because it has an equal number of even and odd digits (one odd digit and one even digit).
Example 2:
Input: n = 403 Output: 1001 Explanation: The smallest fair integer that is greater than or equal to 403 is 1001. 1001 is fair because it has an equal number of even and odd digits (two odd digits and two even digits).
Constraints:
1 <= n <= 109
方法一:分类讨论
我们记
- 若
$a=b$ ,则$n$ 本身就是fair
的,直接返回$n$ 即可; - 否则,若
$k$ 为奇数,那么我们找到$k+1$ 位的最小fair
数即可,形如10000111
;若$k$ 为偶数,我们直接暴力递归closestFair(n+1)
即可。
时间复杂度
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)
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);
}
}
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);
}
};
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)
}