算法练习第9道-各位相加

292 阅读2分钟

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