給定乙個正整數 n,你可以做如下操作:示例 1:\1. 如果 n 是偶數,則用 n / 2替換 n。
\2. 如果 n 是奇數,則可以用 n + 1或n - 1替換 n。
n 變為 1 所需的最小替換次數是多少?
輸入:輸出:解釋:8 -> 4 -> 2 -> 1示例 2:
輸入:輸出:解釋:7 -> 8 -> 4 -> 2 -> 101答案或7 -> 6 -> 3 -> 2 -> 1
public
intintegerreplacement
(int n)
解析:
使用遞迴的方式很容易理解,當n是偶數的時候非常簡單,我們只需要讓n/2代替n即可。當n是奇數的時候,我們取n-1,和n+1計算次數的最小值即可。02另一種思路的遞迴寫法其實這道題我們還可以換種思路。當n是奇數的時候,比如n=2k+1;無論是加1還是減1,結果都會是偶數,這個偶數有可能是4的倍數,有可能只是2的倍數(比如6,10等)。我們為了減少計算次數要盡可能多的往4的倍數上靠。所以當n%4=3的時候我們讓n加1,當n%4=1的時候我們讓n減1。當n等於3的時候是個例外,因為
3→2→1要比3→4→2→1替換次數少。所以我們計算的時候要把n=3的情況單獨處理,我們來看下**
public
intintegerreplacement
(int n)
03 另一種思路的非遞迴寫法
public
intintegerreplacement
(int n)
else
else
} count++;}
return count;
}
上面的3種實現方式其實都很簡單,我們看到在判斷n%4=3的時候有多種實現方式,我們還可以來列舉一下(下面的n首先是奇數,判斷才沒問題),如果判斷結果為true,那麼n對4求餘的結果就是3。1,n%4==3;
2,(n+1)&3==0;
3,(n&2)!=0;
4,integer.bitcount(n + 1) <= integer.bitcount(n -
1)(integer.bitcount是判斷二進位制中1的個數,也可以參照前面講的364,位1的個數系列(一))
397 整數替換
題目描述 給定乙個正整數 n 你可以做如下操作 如果 n 是偶數,則用 n 2替換 n 如果 n 是奇數,則可以用 n 1或n 1替換 n n 變為 1 所需的最小替換次數是多少?示例 1 輸入 n 8 輸出 3 解釋 8 4 2 1 示例 2 輸入 n 7 輸出 4 解釋 7 8 4 2 1 或 ...
397 整數替換
題目描述 給定乙個正整數 n,你可以做如下操作 1.如果 n 是偶數,則用 n 2替換 n。2.如果 n 是奇數,則可以用 n 1或n 1替換 n。問 n 變為 1 所需的最小替換次數是多少?可見,該題的難點在於n是奇數時,應該是n 1還是n 1。解法一 遞迴 當n 1時,return 0 將int...
LeetCode397 整數替換
原題目給定乙個正整數 n,你可以做如下操作 如果 n 是偶數,則用 n 2替換 n。如果 n 是奇數,則可以用 n 1或n 1替換 n。n 變為 1 所需的最小替換次數是多少?示例 1 輸入 8 輸出 3 解釋 8 4 2 1 示例 2 輸入 7 輸出 4 解釋 7 8 4 2 1 或7 6 3 2...