LeetCode 258 各位相加

2021-09-21 17:38:21 字數 1910 閱讀 4622

以下**如無說明均在力扣上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,拿到這道題,瞬間就想到了迴圈的解法,感嘆...