持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第12天,点击查看活动详情
题目(Add Digits)
链接:https://leetcode-cn.com/problems/add-digits
解决数:1275
通过率:71.1%
标签:数学 数论 模拟
相关公司:amazon adobe bytedance
给定一个非负整数 num,反复将各个位上的数字相加,直到结果为一位数。返回这个结果。
示例 1:
输入: num = 38
输出: 2
解释: 各位相加的过程为 : 38 --> 3 + 8 --> 11
11 --> 1 + 1 --> 2
由于 2 是一位数,所以返回 2。
示例 1:
输入: num = 0
输出: 0
提示:
0 <= num <= 231 - 1
进阶: 你可以不使用循环或者递归,在 O(1) 时间复杂度内解决这个问题吗?
思路
思路1,暴力
各数字之和
function addNumber(num) {
let sum = 0
for (let item of num ) {
sum += +item
}
return sum
}
function addNumber(num) {
return (num + '').split('').reduce((p, i) => p + +i, 0)
}
思路2,好理解的
/**
* @param {number} num
* @return {number}
*/
var addDigits = function(num) {
var nums = '' + num;
var add = 0;
var end = 0;
for (var i = 0; i < nums.length; i++) {
add += Number(nums[i]);
}
add = '' + add;
for (var i = 0; i < add.length; i++) {
end += Number(add[i]);
}
return end >= 10 ? addDigits(end) : end
};
思路3
- 最终答案肯定为0-9
- 只有0才能得到0,其他数字只要有数就永远不会加出0,那么其他数字只能对应1-9
- 函数满足 f(a + 1) = f(a) + 1 (这里结果的10看作1)
结果只能是1-9的无限循环
9个一循环,也就是f(a + 9) = f(a),那么我们抛去加的多余的9,结果一致,即f(a) = f(a % 9) (这里结果的f(0)看作9)
/**
* @param {number} num
* @return {number}
*/
var addDigits = function(num) {
return num == 0 ? num : (num - 1) % 9 + 1
};
class Solution:
def addDigits(self, num: int) -> int:
return (num - 1) % 9 + 1 if num else num
class Solution {
public int addDigits(int num) {
return num == 0 ? num : (num - 1) % 9 + 1;
}
}
func addDigits(num int) int {
if num == 0 {
return num
} else {
return (num - 1) % 9 + 1
}
}
思路4
0 0
1-9 1-9
10-18 1-9
19-27 1-9
可以看出来1-9轮回,如果是9的倍数,就是9,否则就是num%9,0需要特殊处理。
代码
/**
* @param {number} num
* @return {number}
*/
var addDigits = function(num) {
if (!num) return num
return num % 9 || 9
};