258.各位相加
题目
给定一个非负整数 num
,反复将各个位上的数字相加,直到结果为一位数。
示例:
1 | 输入 : 38 |
进阶: 你可以不使用循环或者递归,且在 O(1) 时间复杂度内解决这个问题吗?
思路
这道题非常有意思的点是进阶里面说的:
你可以不使用循环或者递归,且在 O(1) 时间复杂度内解决这个问题吗?
说明这道题不止只有暴力循环解法,还有更巧妙的,只用O(1)时间的解法,也就是说,连扫描一趟的功夫都不用,直接就能得到结果.
这个时候就应该通过数学找规律来解题了,先用比较小的数去尝试看看能不能发现规律:
10---1
11---2
12---3
18---9
19---1
20---2
21---3
99---9
100---1
101---2
102---3
109---1
110---2
111---3
117---9
可以看到,有某个数是比较特别的,那就是这个9.
各位相加答案为9的数,刚好也即是9的倍数.也就是说某个数能被9整除,那他的各位相加结果就刚好是9.
并且无法被9整除的数,得到的余数也就刚好是答案.
代码
暴力法:
1 | public int AddDigits(int num) |
规律法:
1 | public int AddDigits(int num) |