5907. 下一个更大的数值平衡数
如果整数 x 满足:对于每个数位 d ,这个数位 恰好 在 x 中出现 d 次。那么整数 x 就是一个 数值平衡数 。
给你一个整数 n ,请你返回 严格大于 n 的 最小数值平衡数 。
示例 1:
输入:n = 1
输出:22
解释:
22 是一个数值平衡数,因为:
- 数字 2 出现 2 次
这也是严格大于 1 的最小数值平衡数。
示例 2:
输入:n = 1000
输出:1333
解释:
1333 是一个数值平衡数,因为:
- 数字 1 出现 1 次。
- 数字 3 出现 3 次。
这也是严格大于 1000 的最小数值平衡数。
注意,1022 不能作为本输入的答案,因为数字 0 的出现次数超过了 0 。
示例 3:
输入:n = 3000
输出:3133
解释:
3133 是一个数值平衡数,因为:
- 数字 1 出现 1 次。
- 数字 3 出现 3 次。
这也是严格大于 3000 的最小数值平衡数。
提示:
0 <= n <= 106
题解:
我们直接从n+1
开始寻找,直到寻找到符合题意的答案为止。
具体的寻找规则即:
对于此时的数,我们将其每位上的数字
都拿到,接着将拿到的数字在哈希表
中进行存储,在存储完毕后,再遍历一下哈希表
进行比对即可。比对规则即“对于每个数位 d ,这个数位 恰好 在 x 中出现 d 次”
,所以即hash[i]==i
,并存储该数共有多少种数字,验证每种数字是不是都符合题意,都符合即找到了下一个更大的数值平衡数。
代码:
class Solution {
public int nextBeautifulNumber(int n) {
n++;
int[] res = new int[10];
int[] hash = new int[10];
int index = 0;
int flag = 0;
int count = 0;
while(true){
int temp = n;
while(temp>0){
res[index++] = temp%10;
temp/=10;
}
for(int i=0;i<index;i++){
hash[res[i]]++;
}
for(int i=0;i<10;i++){
if(hash[i]!=0 && hash[i]==i){
flag++;
}
if(hash[i]!=0){
count++;
}
}
if(flag==count){
return n;
}
flag = 0;
index = 0;
for(int i=0;i<10;i++){
res[i] = 0;
hash[i] = 0;
}
n++;
count = 0;
}
}
}