題目:
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?
思路:
題意在標題里寫清楚了。有種思路可行:即我們把數(shù)字轉(zhuǎn)型為字符串,判斷字符串的長度祸轮,如果不為1筋现,就獲取各個位數(shù)翅萤,轉(zhuǎn)回整形相加蒂萎。一直循環(huán)直到只有一位,以下為代碼:
public int addDigits(int num) {
String numString = String.valueOf(num);
int sum = 0;
int result = 0;
String s = "";
while (numString.length() != 1) {
result = 0;
for(int i=0;i<numString.length();i++) {
s = numString.charAt(i)+"";
sum = Integer.parseInt(s);
result = result + sum;
}
numString = String.valueOf(result);
num = result;
}
return num;
}
但是我們發(fā)現(xiàn)此方法亏掀,非常臃腫缸榄,時間復雜度不低渤弛,題目中最后有挑戰(zhàn)不用循環(huán)和遞歸。所以查閱資料后學習到另外一種方法甚带!下面是引用她肯,感謝原作者~~
有如下關系:num = a * 10000 + b * 1000 + c * 100 + d * 10 + e
即:num = (a + b + c + d + e) + (a * 9999 + b * 999 + c * 99 + d * 9)
因為 a * 9999 + b * 999 + c * 99 + d * 9 一定可以被9整除,因此num模除9的結果與 a + b + c + d + e 模除9的結果是一樣的鹰贵。
對數(shù)字 a + b + c + d + e 反復執(zhí)行同類操作晴氨,最后的結果就是一個 1-9 的數(shù)字加上一串數(shù)字,最左邊的數(shù)字是 1-9 之間的碉输,右側(cè)的數(shù)字永遠都是可以被9整除的籽前。
這道題最后的目標,就是不斷將各位相加,相加到最后聚假,當結果小于10時返回。因為最后結果在1-9之間闰非,得到9之后將不會再對各位進行相加膘格,因此不會出現(xiàn)結果為0的情況。
因為 (x + y) % z = (x % z + y % z) % z财松,又因為 x % z % z = x % z瘪贱,因此結果為 (num - 1) % 9 + 1,只模除9一次辆毡,并將模除后的結果加一返回菜秦。
所以,這種方法掌握后是十分簡便輕松的舶掖。
代碼:
public int addDigits(int num) {
return (num - 1) % 9 + 1;
}