leetcode 258. 各位相加

【题目】258. 各位相加

给定一个非负整数 num,反复将各个位上的数字相加,直到结果为一位数。

示例:

输入: 38
输出: 2 
解释: 各位相加的过程为:3 + 8 = 11, 1 + 1 = 2。 由于 2 是一位数,所以返回 2。

进阶:你可以不使用循环或者递归,且在 O(1) 时间复杂度内解决这个问题吗?

【解题思路1】循环

class Solution {
    public int addDigits(int num) {
        while (num >= 10) {
            int next = 0;
            while (num != 0) {
                next = next + num % 10;
                num /= 10;
            }
            num = next;
        }
        return num;
    }
}

【解题思路2】递归

class Solution {
    public int addDigits(int num) {
        if (num < 10) {
            return num;
        }
        int next = 0;
        while (num != 0) {
            next = next + num % 10;
            num /= 10;
        }
        return addDigits(next);
    }
}

【解题思路3】数学方法

  • n 是 0 ,数根就是 0。
  • n 不是 9 的倍数,数根就是 n 对 9 取余,即 n mod 9。
  • n 是 9 的倍数,数根就是 9。
    可以通过 (n-1) mod 9 + 1 这个式子把上边的几种情况统一起来。
class Solution {
    public int addDigits(int num) {
        return (num - 1) % 9 + 1;
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章