LeetCode 258. 各位相加(模 9)

给定一个非负整数 num,反复将各个位上的数字相加,直到结果为一位数。
输入: 38
输出: 2
解释: 各位相加的过程为:3 + 8 = 11, 1 + 1 = 2。 由于 2 是一位数,所以返回 2。
进阶:
你可以不使用循环或者递归,且在 O(1) 时间复杂度内解决这个问题吗?

常规

以下解法太尝龟了:

 public int addDigits(int num) {
     
        while(num>=10){
     
            num=num/10+num%10;
        }
        return num;
    }

进阶

 public int addDigits(int num) {
     
        return (num - 1% 9 + 1;
    }

解释(来自 LeetCode 评论区大神):

  • xyzk = 1000 * x + 100 * y + 10 * z + k = 999 * x + 99 * y + 9 * z + (x + y + z + k),括号内即为所求(或下一次迭代)
  • 9 这个数字怎么来的,为什么不是8,不是7。本质上因为xyzk这个数是十进制的,所以每一项的系数都是10m,而10m - 1一定是9的倍数。说白了,如果此例的xyzk是一个九进制数,那么这个特殊的系数就应该是8了,因为9m - 1一定是8的倍数
  • 如果 (x + y + z + k) 的值仍然大于 10 怎么办?—— 没关系,因为最终括号外面还是要模9,前面的999、99、9 模 9 后等于零,即使 (x + y + z + k) 大于 10,但这个值还是要模 9,相当于又进行了一次循环
  • 如果最后的 (x + y + z + k) = 9 怎么办?—— 要对模9进行优化了,我们想让最后的9模9之后还是等于9,我们可以写成(9-1)%9+1=9

你可能感兴趣的:(算法)