通過萬歲!!!
- 題目:一共會給四個數,分別是N、M、i、j,然后希望我們把N和M抓怒換為2進制以后,將M的二進制放在i到j之間的區域,如果M的二進制長度小于i-j+1,則前面補0即可。最后輸出轉換后的十進制數字。
- 思路1:最簡單的思路當然是直接按照題目要求,將N和M轉換為二進制,進行處理,然后再轉換為十進制。這里需要用到兩個api,一個是Integer.toBinaryString(N),用來將int轉換為二進制的string;第二個是Integer.parseInt(binaryString, 2),用來將二進制string轉換為10進制。剩下的就比較簡單了,不過這兩個api我也是第一次用到。所以我的第一反應是我的思路2。
- 思路2:我們假設i等于0,可以發現,這個題目其實就是讓N的后j-i=j位變成0,然后再加上M即可,也就是說,N-des+M。那如果i不等于0,也就是這里需要多一個步驟,就是des和M后面都要往右邊移動i位。那就變成了N+(M-des)*2i。到此,我們的問題關鍵就是找des了。這就簡單了,des初始值為0,我們先將N/(2i)得到tmp,然后通過for循環找到tmp的后j-i+1位的數字就好了。
- 技巧:數學,位運算
class Solution {public int insertBits(int N, int M, int i, int j) {int temp = N / ((int) Math.pow(2, i));int des = 0;for (int k = 0; k < j - i + 1; k++) {des += temp % 2 * (int) Math.pow(2, k);temp = temp / 2;}return N + (M - des) * (int) Math.pow(2, i);}
}
- 總結:題目比較簡單,第一個思路需要對api比較熟,第二個思路用到了小學數學。