力扣:6222. 美丽整数的最小增量

172 阅读1分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第32天,点击查看活动详情

6222. 美丽整数的最小增量 - 力扣(LeetCode)

给你两个正整数 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 变成一个美丽整数。
​
示例 2:
输入:n = 467, target = 6
输出:33
解释:最初,n 是 467 ,且其每一位数字的和是 4 + 6 + 7 = 17 。在加 33 之后,n 变为 500 且每一位数字的和变成 5 + 0 + 0 = 5 。可以证明无法加上一个小于 33 的非负整数使 n 变成一个美丽整数。
​
示例 3:
输入:n = 1, target = 1
输出:0
解释:最初,n 是 1 ,且其每一位数字的和是 1 ,已经小于等于 target 。

提示:

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

问题解析

很容易就想出,如果当前n不是一个美丽整数,那么一定是通过加数x使得n进位来减少总数位和。

而因为要求x尽可能小,那么我们可以通过把当前位变成0,下一位+1的方式来逐步使得n进位。直到修改后n的数位和小于等于target。

最后返回修改后的n减去修改前的n,差值就是我们的x。

AC代码

class Solution {
public:
    int get_num(long long x)
    {
        int sum=0;
        while(x)
        {
            sum+=x%10;
            x/=10;
        }
        return sum;
    }
    long long makeIntegerBeautiful(long long n, int target) {
        long long x=n,res=10;
        while(get_num(x)>target)
        {
            x/=res;
            x++;
            x*=res;
            res*=10;
        }
        return x-n;
    }
};