369,整數替換

2022-09-18 09:42:11 字數 1689 閱讀 6499

給定乙個正整數 n,你可以做如下操作:

\1. 如果 n 是偶數,則用 n / 2替換 n。

\2. 如果 n 是奇數,則可以用 n + 1或n - 1替換 n。

n 變為 1 所需的最小替換次數是多少?

示例 1:

輸入:輸出:解釋:8 -> 4 -> 2 -> 1

示例 2:

輸入:輸出:解釋:7 -> 8 -> 4 -> 2 -> 1

或7 -> 6 -> 3 -> 2 -> 1

01答案

public

intintegerreplacement

(int n)

解析:

使用遞迴的方式很容易理解,當n是偶數的時候非常簡單,我們只需要讓n/2代替n即可。當n是奇數的時候,我們取n-1,和n+1計算次數的最小值即可。

其實這道題我們還可以換種思路。當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的情況單獨處理,我們來看下**

02另一種思路的遞迴寫法

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...