トピック
整数のnumを指定して、結果が1桁になるまですべての桁を繰り返し加算し、それを返します。
例1:
Input: num = 38
Output: 2
Explanation: The process is
38 --> 3 + 8 --> 11
11 --> 1 + 1 --> 2
Since 2 has only one digit, return it.
例2:
Input: num = 0
Output: 0
制約:
0 <= num <= 2^31 - 1
フォローアップ:O(1)ランタイムでループ/再帰なしでそれを行うことができますか?
再帰的ソリューション
/*
* @lc app=leetcode.cn id=258 lang=java
*
* [258] 各位相加
*/
// @lc code=start
class Solution {
public int addDigits(int num) {
return (num < 10) ? num : addDigits(num / 10 + num % 10);
}
}
// @lc code=end
線形解O(1)時間計算量
public class Solution {
public int addDigits(int num) {
if (num == 0){
return 0;
}
if (num % 9 == 0){
return 9;
}
else {
return num % 9;
}
}
}
私はその背後にある数学を説明しようとします:
まず、次のことを理解する必要があります。
10^k % 9 = 1
a*10^k % 9 = a % 9
次に、例を使用して説明します。
说一个数字x = 23456
x = 2 * 10000 + 3 * 1000 + 4 * 100 + 5 * 10 + 6
2 * 10000%9 = 2%9
3 * 1000%9 = 3%9
4 * 100%9 = 4%9
5 * 10%9 = 5%9
次にx%9 =(2+ 3 + 4 + 5 + 6)%9
、注意してくださいx = 2 * 10000 + 3 * 1000 + 4 * 100 + 5 * 10 + 6
だから私たちは持っています23456%9 =(2 + 3 + 4 + 5 + 6)%9