Welcome to Subscribe On Youtube
2048. Next Greater Numerically Balanced Number
Description
An integer x
is numerically balanced if for every digit d
in the number x
, there are exactly d
occurrences of that digit in x
.
Given an integer n
, return the smallest numerically balanced number strictly greater than n
.
Example 1:
Input: n = 1 Output: 22 Explanation: 22 is numerically balanced since: - The digit 2 occurs 2 times. It is also the smallest numerically balanced number strictly greater than 1.
Example 2:
Input: n = 1000 Output: 1333 Explanation: 1333 is numerically balanced since: - The digit 1 occurs 1 time. - The digit 3 occurs 3 times. It is also the smallest numerically balanced number strictly greater than 1000. Note that 1022 cannot be the answer because 0 appeared more than 0 times.
Example 3:
Input: n = 3000 Output: 3133 Explanation: 3133 is numerically balanced since: - The digit 1 occurs 1 time. - The digit 3 occurs 3 times. It is also the smallest numerically balanced number strictly greater than 3000.
Constraints:
0 <= n <= 106
Solutions
Solution 1: Enumeration
We note that the range of $n$ in the problem is $[0, 10^6]$, and one of the balanced numbers greater than $10^6$ is $1224444$. Therefore, we directly enumerate $x \in [n + 1, ..]$ and then judge whether $x$ is a balanced number. The enumerated $x$ will definitely not exceed $1224444$.
The time complexity is $O(M - n)$, where $M = 1224444$. The space complexity is $O(1)$.
-
class Solution { public int nextBeautifulNumber(int n) { for (int x = n + 1;; ++x) { int[] cnt = new int[10]; for (int y = x; y > 0; y /= 10) { ++cnt[y % 10]; } boolean ok = true; for (int y = x; y > 0; y /= 10) { if (y % 10 != cnt[y % 10]) { ok = false; break; } } if (ok) { return x; } } } }
-
class Solution { public: int nextBeautifulNumber(int n) { for (int x = n + 1;; ++x) { int cnt[10]{}; for (int y = x; y > 0; y /= 10) { ++cnt[y % 10]; } bool ok = true; for (int y = x; y > 0; y /= 10) { if (y % 10 != cnt[y % 10]) { ok = false; break; } } if (ok) { return x; } } } };
-
class Solution: def nextBeautifulNumber(self, n: int) -> int: for x in count(n + 1): y = x cnt = [0] * 10 while y: y, v = divmod(y, 10) cnt[v] += 1 if all(v == 0 or i == v for i, v in enumerate(cnt)): return x
-
func nextBeautifulNumber(n int) int { for x := n + 1; ; x++ { cnt := [10]int{} for y := x; y > 0; y /= 10 { cnt[y%10]++ } ok := true for y := x; y > 0; y /= 10 { if y%10 != cnt[y%10] { ok = false break } } if ok { return x } } }
-
function nextBeautifulNumber(n: number): number { for (let x = n + 1; ; ++x) { const cnt: number[] = Array(10).fill(0); for (let y = x; y > 0; y = (y / 10) | 0) { cnt[y % 10]++; } let ok = true; for (let i = 0; i < 10; ++i) { if (cnt[i] && cnt[i] !== i) { ok = false; break; } } if (ok) { return x; } } }