題目描述:
給定乙個正整數 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型的值傳給m時,需要將m的型別申明為long long型。因為如果int 型的n為2147483647時,m=(n+1)/2的過程中n+1就會溢位。
int, long int都是4個位元組的有符號數,最大值為2147483647.
可以將int型的實參傳遞給long long型的形參。
classsolution
}};
解法2:利用位運算
1class
solution
15 res+=2
;16 }//
這乙個if判斷語句中包含了兩種情況,舉個例子:110111 首先初次判斷為奇數,右移一位,相當於-1,再除以2 這時候res=2,n=011011,再次判斷為奇數,+1,n=011100 這個結果與最初的n=110111先加1n=111000再右移1位是一樣的n=011100 所以這樣的操作以後res+=2;
17//
倘若最開始的n=1101,那麼初次判斷以後為奇數,-1,/2,此時n=0110就不用再進行加1操作了
//(n-1)/2 +1 ==(n+1)/2
18else
1923}24
return res+n-1;25
}26 };
這道題有一定的技巧,感覺時間是在o(1)(菜雞瞎猜的,這道題感覺是個腦力題,不僅要求對位運算熟悉,還要求要對整數的二進位制表示很熟悉,在leetcode上擊敗了100%的c++使用者,在時間上)
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 或 ...
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...
369,整數替換
給定乙個正整數 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答案...