本文旨在对于个人知识的梳理以及知识的分享,如果有不足的地方,欢迎大家在评论区指出
题目描述
配对交换。编写程序,交换某个整数的奇数位和偶数位,尽量使用较少的指令(也就是说,位0与位1交换,位2与位3交换,以此类推)。
示例1:
输入:num = 2(或者0b10)
输出 1 (或者 0b01)
示例2:
输入:num = 3
输出:3
提示:
- num的范围在[0, 2^30 - 1]之间,不会发生整数溢出。
题目链接
题目分析
我的思路是先分析题目中数字的范围,最大为32位,所以我只需要枚举每一位,之后两两交换每一位,得到最终的解就好了,偏向于模拟的写法,拿一个数字来举例,例如给定数字6,首先6的二进制表示缩减为0110
,之后相应的求解过程如下:
0110
假设res = 0
首先分析第一组10,此时这里原本的计算为0*2^0+1*2^1
现在我们只需要将它颠倒,变成1*2^0+0*2^1即可,然后将这个新的计算结果累加到结果集中,
也就是此时res = 1
之后看第二组01,此时这里原本的计算为1*2^2+0^2^3
现在我们将它颠倒,变成1*2^3+0*2^2,将这个结果放到结果集中,此时res = 9
也就求出了我们要的结果
那么第二种解法偏向于数学方面,它是利用了0xaaaaaaaa
以及0x55555555
这两个数字,首先看每一个a
和每一个5
,发现a
的二进制表示为1010
,而5
为0101
,故如果我们让num & 0xaaaaaaaa
就可以获得该数字的所有奇数位,而num & 0x55555555
就可以获得该数字的所有偶数位,之后我们让偶数位的数字右移一位,奇数位的数字左移一位,这两个数字或起来就是最终的解
解题代码
解法一
Python
class Solution:
def exchangeBits(self, num: int) -> int:
res = 0
for i in range(0, 32, 2):
even = num>>i&1
odd = (num>>i+1)&1
res += even*pow(2, i+1) + odd*pow(2, i)
return res
Java
class Solution {
public int exchangeBits(int num) {
int res = 0;
for(int i=0; i<32; i+=2){
int even = num>>i&1;
int odd = (num>>i+1)&1;
res += even*Math.pow(2, i+1) + odd*Math.pow(2, i);
}
return res;
}
}
解法二
Python
class Solution:
def exchangeBits(self, num: int) -> int:
a, b = num&0xaaaaaaaa, num&0x55555555
a >>= 1
b <<= 1
return a | b
Java
class Solution {
public int exchangeBits(int num) {
int a = num & 0xaaaaaaaa;
int b = num & 0x55555555;
a >>= 1; b <<= 1;
return a | b;
}
}