day20, 各位相加
题目来源:leetcode
给定一个非负整数num,反复将各个位上的数字相加,直到结果为一位数。
示例:
输入: 38
输出: 2
解释: 各位相加的过程为:3 + 8 = 11, 1 + 1 = 2。 由于 2 是一位数,所以返回 2。
进阶:
你可以不使用循环或者递归,且在O(1)时间复杂度内解决这个问题吗?
解答:方法一:用栈。见代码。
方法二:既然题目说能在O(1)时间复杂度内解决问题。那么必然存在公式解。题目要求最后结果为一位数字,则必然处于0~9之间的某一个数字, 这里采用数字根法。
数根公式:当 n = 0 时,数根为 0 ; 当 n ≠ 0 且 n % 9 = 0 时, 数根为 9 ; 其余情况为 n % 9;
上述公式简化为:数根 = 1 + (n-1) mod 9.
代码:方法一:
int addDigits(int num) {
stack<int> record;
record.push( num);
while( 1){
if( record.top()>=10){
int k = record.top();
record.pop();
while( k){
record.push( k%10);
k/=10;
}
}
if( record.size() == 1 && record.top() <10)
return record.top();
int k1 = record.top();
record.pop();
int k2 = record.top();
record.pop();
record.push( k1 + k2);
}
return record.top();
}
运行结果:
代码:方法二
int addDigits(int num) {
return 1 + ( num - 1 ) % 9;
}
运行结果在此略过。