Skip to content

2417. Closest Fair Integer

  • Time: $O(1)$
  • Space: $O(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
29
30
class Solution {
 public:
  int closestFair(int n) {
    const int digitsCount = to_string(n).length();
    return digitsCount % 2 == 0 ? getEvenDigits(n) : getOddDigits(digitsCount);
  }

 private:
  long getOddDigits(int digitsCount) {
    const int zeros = (digitsCount + 1) / 2;
    const int ones = (digitsCount - 1) / 2;
    return stoi('1' + string(zeros, '0') + string(ones, '1'));
  }

  int getEvenDigits(int n) {
    const int digitsCount = to_string(n).length();
    const long maxNum = stol('1' + string(digitsCount, '0'));
    for (long num = n; num < maxNum; ++num)
      if (isValidNum(num))
        return num;
    return getOddDigits(digitsCount + 1);
  }

  bool isValidNum(long num) {
    int count = 0;
    for (const char c : to_string(num))
      count += (c - '0') % 2 == 0 ? 1 : -1;
    return count == 0;
  }
};
 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) {
    final int digitsCount = String.valueOf(n).length();
    return digitsCount % 2 == 0 ? getEvenDigits(n) : (int) getOddDigits(digitsCount);
  }

  private long getOddDigits(int digitsCount) {
    final int zeros = (digitsCount + 1) / 2;
    final int ones = (digitsCount - 1) / 2;
    return Integer.valueOf('1' + "0".repeat(zeros) + "1".repeat(ones));
  }

  private int getEvenDigits(int n) {
    final int digitsCount = String.valueOf(n).length();
    final long maxNum = Long.valueOf('1' + "0".repeat(digitsCount));
    for (long num = n; num < maxNum; ++num)
      if (isValidNum(num))
        return (int) num;
    return (int) getOddDigits(digitsCount + 1);
  }

  private boolean isValidNum(long num) {
    int count = 0;
    for (final char c : String.valueOf(num).toCharArray())
      count += (c - '0') % 2 == 0 ? 1 : -1;
    return count == 0;
  }
}
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
class Solution:
  def closestFair(self, n: int) -> int:
    digitsCount = len(str(n))
    return (self._getEvenDigits(n) if digitsCount % 2 == 0 else
            self._getOddDigits(digitsCount))

  def _getOddDigits(self, digitsCount: int) -> int:
    zeros = (digitsCount + 1) // 2
    ones = (digitsCount - 1) // 2
    return int('1' + '0' * zeros + '1' * ones)

  def _getEvenDigits(self, n: int) -> int:
    digitsCount = len(str(n))
    maxNum = int('1' + '0' * digitsCount)
    for num in range(n, maxNum):
      if self._isValidNum(num):
        return num
    return self._getOddDigits(digitsCount + 1)

  def _isValidNum(self, num: int) -> bool:
    count = 0
    for c in str(num):
      count += 1 if int(c) % 2 == 0 else -1
    return count == 0