【算法刷题】——美丽整数的最小增量

╰+攻爆jí腚メ 2024-04-01 12:34 114阅读 0赞

美丽整数的最小增量

1.题目描述

原题入口

给你两个正整数 n 和 target 。
如果某个整数每一位上的数字相加小于或等于 target ,则认为这个整数是一个 美丽整数 。
找出并返回满足 n + x 是 美丽整数 的最小非负整数 x 。生成的输入保证总可以使 n 变成一个美丽整数。

示例 1:
输入:n = 16, target = 6 输出:4 解释:最初,n 是 16 ,且其每一位数字的和是 1 + 6 = 7 。在加 4
之后,n 变为 20 且每一位数字的和变成 2 + 0 = 2 。可以证明无法加上一个小于 4 的非负整数使 n 变成一个美丽整数。

提示:

  • 1 <= n <= 10^12
  • 1 <= target <= 150
  • 生成的输入保证总可以使 n 变成一个美丽整数。

2.解题思路

题目描述很容易读懂,给定一个数n,要求n加上一个最小的数 相加之后的数各个数位之和小于 target。最容易想到的思路就是暴力穷举,一直加1直到符合条件。但是看题目数据量 n是12次方的,穷举肯定就超时了。
换一种思路,如何把一个数位的数变小,只能加。很容易想到只要进位变成0,那么这个数位的数就减少了。比如 734504727 10 这个测试示例,我们从低位到高位 每个数位都变成0 一直到符合条件为止。因此我们需要一个集合存储n的各个数位,这样方便进行数位和、相加的数大小的计算。

734504727 39
734504730 33
734504800 31
734505000 24
734510000 20
734600000 20
735000000 15
740000000 11
800000000 8

3.代码实现

  1. class Solution {
  2. // 记录每一位的数
  3. List<Integer> list = new ArrayList<>();
  4. public long makeIntegerBeautiful(long n, int target) {
  5. // 记录当前各位数之和
  6. int ans = add(n);
  7. //如果本身就符合条件直接返回0
  8. if(ans <= target) return 0L;
  9. //记录加的数
  10. long res = 0L;
  11. //当前到哪一位
  12. int idx = 0;
  13. while (idx < list.size() && ans > target){
  14. //当前位变0 注意 list存储的是进位前的数位 进位后都要加1
  15. ans = ans - list.get(idx) + (idx == 0 ? 1 : 0) ;
  16. //加的数字 除了最后一位其余的都进位了,但是list集合中没有更新,因此需要再-1
  17. res += ((10-list.get(idx) - (idx == 0 ? 0 : 1)) * Math.pow(10,idx));
  18. idx++;
  19. }
  20. return res;
  21. }
  22. int add(long n){
  23. int num = 0;
  24. while( n!= 0){
  25. num += n % 10;
  26. list.add((int) (n % 10));
  27. n /= 10;
  28. }
  29. return num;
  30. }
  31. }

发表评论

表情:
评论列表 (有 0 条评论,114人围观)

还没有评论,来说两句吧...

相关阅读

    相关 算法-

    剑指Offer快速过了一遍 字节-飞书高频题-前15 各公司的高频面试算法题,可在 [CodeTop][]查询 (1) 146. LRU 缓存机制 我的实现