leetcode.5907. 下一个更大的数值平衡数---哈希思想

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;
        }
        
    }
}

猜你喜欢

转载自blog.csdn.net/xiangguang_fight/article/details/120941092