Offer 驾到,掘友接招!我正在参与2022春招系列活动-刷题打卡任务,点击查看活动详情。
一、题目
给定一个非负整数 num,反复将各个位上的数字相加,直到结果为一位数。返回这个结果。
示例1
输入: num = 38
输出: 2
解释: 各位相加的过程为:
38 --> 3 + 8 --> 11
11 --> 1 + 1 --> 2
由于 2 是一位数,所以返回 2。
示例2
输入: num = 0
输出: 0
思路分析
思路1
-
首先想到的就是递归,通过每次的递归,拿到新的值,这里的数字处理方式是把它切割开,然后相加,如果小于
10,就return,大于10就继续递归 -
然后看到示例2,想到的是如果第一次值小于
10,就直接return -
这里叠加用到了reducer,它有四个参数,分别是
pre 累加器
cur 当前值
index 当前索引
arr 数组
思路2
- 先判断是否大于10的情况,如果大于10,先取第一位值,除10,取整数部分,第二位取余数
- 两者相加比较, 然后再递归
思路3
- 递减思路
- 要求是两位相加,直到最后一位为个位位置,
- 假设两位数组的个位为0,那么这个两位数相加,必然为个位数
- 使用while循环, num>= 10
- 然后在内部开始两位相加的处理,在num>0的while外定义一个为0的新值,
- 先取余之后加上定义的新值的初始值,然后取整,这时候num还是大于0的,
- 再次进入这个while循环,现在叠加第一次的余数和整数,同时因为满足大于0,再次进入while
- 直到最后为0,
- 跳出num>0后,sum就是最后的个位值了,将sum赋值给num,跳出了num>=10的循环,返回num
该思路来源leetCode官方解答
代码
思路1
let addDigits = function(num) {
if(num < 10) {
return num
} else {
let newNum = num.toString().split('').reduce((pre, cur) => Number(pre) + Number(cur))
if(newNum >= 10) {
return addDigits(newNum)
} else {
return newNum
}
}
}
思路2
let addDigits = function(num) {
if(num>=10) {
let first = Math.floor(num/10)
let last = num % 10
if (first + last >= 10) {
return addDigits((pre+n))
}else {
return first + last
}
}
return num
}
思路3
while(num >= 10 ) {
let sum = 0
while (num > 0) {
sum += num % 10
num = Math.floor(num/10)
}
num = sum
}
return num