【教3妹学编程-算法题】需要添加的硬币的最小数量

3妹 :2哥2哥,你有没有看到新闻, 有人中了2.2亿彩票大奖!
2哥 : 看到了,2.2亿啊, 一生一世也花不完。
3妹 :为啥我就中不了呢,不开心呀不开心。
2哥 : 得了吧,你又不买彩票,还是脚踏实地的好~
3妹 :小富靠勤,中富靠德,大富靠命, 可能是我命不好。
2哥 : 哎,想我口袋只有几个硬币,叮咚作响。
3妹:说到硬币, 我今天看到一个关硬币的题目,让我也来考考你吧~

题目:

如果整数 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 <= 10^6

思路:

题目给一个整数 n ,要求返回严格大于 n 的最小数值平衡数,我们直接按照题目的要求进行模拟即可。

观察到 0<=n<=10^6 , 我们可能返回的数值平衡数最大是 1224444,这个范围可以在时间要求内找到答案。

我们依次枚举大于 n 的整数,统计所有数字的出现频数,判断是否是数值平衡数即可。

java代码:

复制代码
class Solution {
    public int nextBeautifulNumber(int n) {
        for (int i = n + 1; i <= 1224444; ++i) {
            if (isBalance(i)) {
                return i;
            }
        }
        return -1;
    }

    private boolean isBalance(int x) {
        int[] count = new int[10];
        while (x > 0) {
            count[x % 10]++;
            x /= 10;
        }
        for (int d = 0; d < 10; ++d) {
            if (count[d] > 0 && count[d] != d) {
                return false;
            }
        }
        return true;
    }
}
相关推荐
fail_to_code10 分钟前
递归法的递归函数何时需要返回值
算法
C137的本贾尼22 分钟前
(每日一道算法题)二叉树剪枝
算法·机器学习·剪枝
BUG收容所所长2 小时前
栈的奇妙世界:从冰棒到算法的华丽转身
前端·javascript·算法
XRZaaa2 小时前
常见排序算法详解与C语言实现
c语言·算法·排序算法
@我漫长的孤独流浪2 小时前
数据结构测试模拟题(4)
数据结构·c++·算法
智驱力人工智能2 小时前
智慧零售管理中的客流统计与属性分析
人工智能·算法·边缘计算·零售·智慧零售·聚众识别·人员计数
WindSearcher3 小时前
大模型微调相关知识
后端·算法
取酒鱼食--【余九】3 小时前
rl_sar实现sim2real的整体思路
人工智能·笔记·算法·rl_sar
Magnum Lehar5 小时前
vulkan游戏引擎test_manager实现
java·算法·游戏引擎
水蓝烟雨5 小时前
[面试精选] 0094. 二叉树的中序遍历
算法·面试精选