以下**如無說明均在力扣上c++語言執行通過題目位址 | 給定乙個非負整數
num
,反覆將各個位上的數字相加,直到結果為一位數。
高階:你可以不使用迴圈或者遞迴,且在 o(1) 時間複雜度內解決這個問題嗎?首先用常規的思路想,肯定是要用到迴圈的,首先計算出給定數字的各位之和,然後再看得到的結果,如果該結果不為一位數,則繼續之前的步驟進行計算,否則退出迴圈,輸出結果。問題的解答步驟可以描述如下:
計算完數值 num 的各位之和,並存到乙個臨時變數 temp 中;
若 temp < 10,則重複第1步;否則退出迴圈。
**如下【執行用時:12ms,記憶體消耗:8.3mb】:
class solution else }}
return temp;}};
上述**有乙個地方需要注意,第13行,一開始我沒有加上第13行,這意味著temp每次計算完一輪之後都沒有歸零,一直在累加上次迴圈完後的結果,導致程式陷入死迴圈中。
現在來嘗試不用迴圈解決問題。
我們來分析一下這種變換之後的數字的規律,設 num
=abc
num = abc
num=ab
c,即 s1=
100a+10
b+cs1 = 100a+10b+c
s1=100
a+10
b+c,則變換之後,s2=
a+b+
cs2 = a+b+c
s2=a+b
+c,有s 1−
s2=99
a+9b
=9(11
a+b)
s1-s2=99a+9b=9(11a+b)
s1−s2=
99a+
9b=9
(11a
+b),差值是9的倍數,s2s2
s2是s 1s1
s1去除部分9的倍數之後的結果。若s2s2
s2不為一位數,假設s2=
10x+y
s2=10x+y
s2=10x
+y,則s 3=
x+ys3=x+y
s3=x+y
,有s 2−
s3=9
xs2-s3=9x
s2−s3=
9x,差值也為9的倍數,s3s3
s3是s 2s2
s2去除部分9的倍數之後的結果。即,每次變換前後的差值都為9的倍數,故最後的結果總為num
但是,結果為num
num%9
num的話,結果明顯是小於9的。當num為9的時候,結果明顯為9,但是依據我們前面的分析得出來是0。故可以在計算的時候進行判斷,如果num
%9==
0num\%9==0
num%9=
=0,則輸出999。
**如下【執行用時:16ms,記憶體消耗:8.4mb】:
class solution
} return temp;}};
也可以直接return回去,一行**解決【執行用時:16ms,記憶體消耗:8.3mb】:
class solution
};
事實上,在c++中,三目運算子的運算效率比if…else要低,所以還是盡量少用三目運算子。
LeetCode 258 各位相加
題目描述 給定乙個非負整數num 反覆將各個位上的數字相加,直到結果為一位數。示例 輸入 38 輸出 2 解釋 各位相加的過程為 3 8 11,1 1 2。由於 2 是一位數,所以返回 2。解題思路 輸入的數為非負數,當輸入的數為個位數的時候不用疊加直接輸出 ac 1 int adddigits i...
LeetCode 258 各位相加
給定乙個非負整數num,反覆將各個位上的數字相加,直到結果為一位數。示例 輸入 38輸出 2解釋 各位相加的過程為 3 8 11,1 1 2。由於2是一位數,所以返回 2。class solution def adddigits self,num type num int rtype int sum...
LeetCode 258 各位相加
給定乙個非負整數num,反覆將各個位上的數字相加,直到結果為一位數。示例 輸入 38輸出 2解釋 各位相加的過程為 3 8 11,1 1 2。由於 2 是一位數,所以返回 2。高階 你可以不使用迴圈或者遞迴,且在 o 1 時間複雜度內解決這個問題嗎?emmm,拿到這道題,瞬間就想到了迴圈的解法,感嘆...