258、给定一个非负整数 num,反复将各个位上的数字相加,直到结果为一位数。
示例:
输入: 38 输出: 2 解释: 各位相加的过程为:3 + 8 = 11, 1 + 1 = 2。 由于 2 是一位数,所以返回 2。 进阶: 你可以不使用循环或者递归,且在 O(1) 时间复杂度内解决这个问题吗?
一、普通解法(递归)
public static int addDigits(int num) { if (num < 10){ return num; } int temp = num; int sum = 0; while (temp != 0){ sum += temp % 10; temp /= 10; } return addDigits(sum); }复制代码
二、进阶解法
通过枚举发现规律,即若数为9的倍数,则结果为9,若不是则各位相加的结果为对9取余。
public static int addDigits(int num) { if (num < 10) return num; // 取余数 int temp = num % 9; // 如果该数字对9整除,则返回9 if (temp == 0) { return 9; }else { // 否则是返回各个位数之和与9取余 return temp; } }复制代码