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

题目来源:https://leetcode.cn/problems/minimum-addition-to-make-integer-beautiful/

C++题解: 本题难度为中等。题解:找到满足n+x为美丽整数的最小非负整数x关键为找到new=n+x。进位可以使总数字和+1,再减去低位的数值。所以我们可以计算从高位往低位各个数字的和,即467分别为0,4,10,17,进位之后和变为1,5,11,18,所以如果target是6的话,最小new就是500,如果target是4的话,则需再进一位,变成1000。为找到最小new,需从低位数字和开始判断(即18,11,5,1)。

注意n的长度范围和n的最低位sum是否已经小于target。

第一步,将n按位分开并存放在nums中;第二步,计算每一位与其高位数字的和;第三步,从最低位开始往高位判断数字之和+1是否小于等于target(最低位数字之和判断时不用+1)。

class Solution {
public:
    long long makeIntegerBeautiful(long long n, int target) {
        long long x=0,ten=0,ten_=0;
        long long nums[13];//存放n的每个位置上的数值
        int ind, sum = 0;
        bool flg = true;
        int sums[13];//存放n的每个位置上的数值与高位数值的和
        //将n按位拆分开
        for (int ii=0; ii<13; ii++){
            ten = pow(10,ii+1);
            ten_ = pow(10,ii);
            if(ii==0) nums[ii] = n%ten;
            else nums[ii] = (n%ten-n%ten_)/ten_;
        }
        
        //存放第jj位及其高位的和
        for (int jj=12;jj>=0;jj--)
        {
            sum = sum+nums[jj];
            sums[jj] = sum;
            //flg用于判断n为几位数
            if ((nums[jj]==0)&&flg) {ind = jj; flg = false;}
        }
        
        if(sum<=target) return x;
        else
        {
            for(int kk=0; kk<ind+1; kk++){
                //判断第kk位及其高位上的数值和是否+1就能小于target,则找到目标最小数值
                if (sums[kk]+1<=target){
                    ten = pow(10,kk+1);
                    ten_ = pow(10,kk);
                    x = (nums[kk]+1)*ten_-n%ten;
                    break;
                }
                //如果n的第kk位及其高位上的数值和+1都不能满足条件,目标最小数值为n的高一个数量级
                if(kk == ind) x = pow(10,ind)-n;
            }
        }
        return x;
    }
};

2022/10/30日周赛遇到的题目,本地题解pow(10,n)出现点问题,目前没有发现问题在哪。因此不提供本地题解。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值