持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第30天,点击查看活动详情
🎈算法并不一定都是很难的题目,也有很多只是一些代码技巧,多进行一些算法题目的练习,可以帮助我们开阔解题思路,提升我们的逻辑思维能力,也可以将一些算法思维结合到业务代码的编写思考中。简而言之,平时进行的算法习题练习带给我们的好处一定是不少的,所以让我们一起来养成算法练习的习惯。今天练习的题目是一道中等难度的题目 -> 美丽整数的最小增量
题目描述
给你两个正整数 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 <= 10^121 <= target <= 150- 生成的输入保证总可以使
n变成一个美丽整数。
思路分析
首先我们要先理解一下题目的意思,题目会我们两个正整数 n 和 target,我们需要计算n加上多少之后会变成一个美丽整数,如果某个整数每一位上的数字相加小于或等于 target ,则认为这个整数是一个 美丽整数 。
为了让一个整数每一位上的数字相加和变小,我们只能是尽可能地将这个整数的每一位数字都变小,而题目要求的是要计算最小增量,所以我们应该要从个位数开始往高位数去进行修改。
- 计算整数每一位上的数字和
const getSum = (num)=>{
let sum = 0;
for(const s of num + ''){
sum += parseInt(s);
}
return sum;
}
- 整数由低位到高位化零
let res = 0;
let ind = 1
while(getSum(n) > target){
const p = Math.pow(10,ind);
let num = n % p;
n += p - num;
res += p - num;
ind ++;
}
完整AC代码如下:
AC代码
/**
* @param {number} n
* @param {number} target
* @return {number}
*/
var makeIntegerBeautiful = function(n, target) {
const getSum = (num)=>{
let sum = 0;
for(const s of num + ''){
sum += parseInt(s);
}
return sum;
}
let res = 0;
let ind = 1
while(getSum(n) > target){
const p = Math.pow(10,ind);
let num = n % p;
n += p - num;
res += p - num;
ind ++;
}
return res;
};
说在后面
🎉这里是JYeontu,喜欢算法,GDCPC打过卡;热爱羽毛球,大运会打过酱油。毕业一年,两年前端开发经验,目前担任H5前端开发,算法业余爱好者,有空会刷刷算法题,平时喜欢打打羽毛球🏸 ,也喜欢写些东西,既为自己记录📋,也希望可以对大家有那么一丢丢的帮助,写的不好望多多谅解🙇,写错的地方望指出,定会认真改进😊,在此谢谢大家的支持,我们下文再见🙌。