Total Accepted: 98922
Total Submissions: 202805
Difficulty: Easy
Given a non-negative integer num
, repeatedly add all its digits until the result has only one digit.
For example:
Given num = 38
, the process is like: 3 + 8 = 11
, 1 + 1 = 2
. Since 2
has only one digit, return it.
Follow up:
Could you do it without any loop/recursion in O(1) runtime?
1 common algorithm:
public class Solution {
public int addDigits(int num) {
int m = 0;
if(num <= 9) {return num;}
else{
while(num != 0){
m += num % 10;
num /= 10;
} ;
return addDigits(m);
}
}
}
如何得到每一位的值?在我这里使用的是%的方法。每次先进行数字的求模,然后通过除法运算符
得到出最后一位剩余的数字。如此循环,可以得到所有位数的和。
最后一句
return addDigits(m);
是比较好的算法。通过一步步的迭代得到最后的值。
但是这种算法的复杂度绝对要很高。
2 通过字符串的方法:
public class Solution {
public int addDigits(int num) {
int m = getTemp(num);
while(m >= 10) {
m = getTemp(m);
}
return m;
}
public static int getTemp(int num) {
String temp = String.valueOf(num); //String temp = "" + num;
char[] chars = temp.toCharArray();
int sum = 0;
for(char c:chars) {
//sum += (int)c;
sum += Integer.parseInt(""+c);
}
return sum;
}
}
3 题目要求没有递归,没有循环,且时间复杂度为O(1)。那就找规律。
input: 0 1 2 3 4 ...
output: 0 1 2 3 4 5 6 7 8 9 1 2 3 4 5 6 7 8 9 1 2 3 ....
class Solution {
public:
int addDigits(int num) {
return num%9 == 0? (num==0?0:9) : num%9;
}
};