leetcode 258 : 各位相加
给定一个非负整数 num ,反复将各个位上的数字相加,直到结果为一位数。返回这个结果。
示例 1:
输入: num = 38
输出: 2
解释: 各位相加的过程为:
38 --> 3 + 8 --> 11
11 --> 1 + 1 --> 2
由于 2 是一位数,所以返回 2。
示例 1:
输入: num = 0
输出: 0
提示:
进阶:你可以不使用循环或者递归,在 O(1) 时间复杂度内解决这个问题吗?
Related Topics
数学
数论
模拟
思路1:
public int addDigits(int num) {
? ?while (num > 9){
? ? ? ?int result = 0;
? ? ? ?while(num > 0){
? ? ? ? ? ?result += num % 10;
? ? ? ? ? ?num /= 10;
? ? ? }
? ? ? ?num = result;
? }
? ?return num;
}
思路2 :
时间复杂度为O(1)
-
举例: num = x*100+y*10+z = x*99 + y * 9 + x + y + z -
如果x+y+z大于9,可以继续num % 9 通过这样的方式计算。但是如果这个值是9的倍数,那么会发生错误。 -
为了解决上述问题,可以给num-1 ,使num - 1 = x * 100 + y * 10 + z -1 = x * 99 + y * 9 + x + y + z -1 。当num为99时,num-1为98,98%9为8,最终加1可以计算最终结果。 public int addDigits(int num) {
? ?return (num - 1)%9 + 1;
}
解答成功:
执行耗时:0 ms,击败了100.00% 的Java用户
内存消耗:39 MB,击败了5.04% 的Java用户
|