【題目】面試題 05.07. 配對交換
配對交換。編寫程序,交換某個整數的奇數位和偶數位,儘量使用較少的指令(也就是說,位0與位1交換,位2與位3交換,以此類推)。
示例1:
輸入:num = 2(或者0b10)
輸出 1 (或者 0b01)
示例2:
輸入:num = 3
輸出:3
提示:
num的範圍在[0, 2^30 - 1]之間,不會發生整數溢出。
【解題思路1】獲取奇數位/偶數位再合併
class Solution {
public int exchangeBits(int num) {
//奇數
int odd = num & 0x55555555;
//偶數
int even = num & 0xaaaaaaaa;
odd = odd << 1;
even = even >>> 1;
return odd | even;
}
}
【解題思路2】獲取num的每位
然後通過判斷奇數位還是偶數位再左移到指定的位置的方式實現
class Solution {
public int exchangeBits(int num) {
int ans = 0, count = 0;
while (num > 0) {
int last = (num & 1); //取得num的最後一位
num >>= 1;
if (count % 2 == 0)
last <<= 1 * (count + 1);
else
last <<= 1 * (count - 1);
ans |= last;
count++;
}
return ans;
}
}
class Solution {
public int exchangeBitsTwo(int num) {
int result = 0;
int addCount = 0;
while (num != 0){
int last = num & 1;
num >>= 1;
addCount++;
if (addCount % 2 == 0){
last <<= (addCount - 2);
}else {
last <<= addCount;
}
result |= last;
}
return result;
}
}