Easy
题目描述
颠倒给定的 32 位无符号整数的二进制位。
示例 1:
输入:n = 43261596 输出:964176192 解释:
| 整数 | 二进制 |
|---|---|
| 43261596 | 00000010100101000001111010011100 |
| 964176192 | 00111001011110000010100101000000 |
示例 2:
输入:n = 2147483644 输出:1073741822 解释:
| 整数 | 二进制 |
|---|---|
| 2147483644 | 01111111111111111111111111111100 |
| 1073741822 | 00111111111111111111111111111110 |
约束条件:
- 0 ≤ n ≤ 2³¹ - 2
- n 是偶数
进阶: 如果这个函数被频繁调用,你该如何优化它?
解题思路
这道题要求我们将32位整数的二进制位进行颠倒。有几种常见的解法:
方法一:逐位处理(推荐) 最直观的方法是逐位提取原数字的最低位,然后将其添加到结果的最高位。具体过程:
- 从右到左逐个提取原数字的二进制位
- 将提取的位从左到右放入结果中
- 重复32次完成所有位的颠倒
方法二:分治法优化 可以使用分治的思想,先交换相邻的位,再交换相邻的2位组,依此类推。这种方法的优势是减少了循环次数,但代码复杂度较高。
方法三:查表法(适用于频繁调用) 如果函数被频繁调用,可以预先计算所有8位数字(0-255)的颠倒结果,然后将32位数字分成4个8位段分别查表,最后组合结果。
对于本题,方法一最容易理解且效率足够,是最推荐的解法。
代码实现
class Solution {
public:
int reverseBits(int n) {
int result = 0;
for (int i = 0; i < 32; i++) {
result = (result << 1) | (n & 1);
n >>= 1;
}
return result;
}
};
class Solution:
def reverseBits(self, n: int) -> int:
result = 0
for i in range(32):
result = (result << 1) | (n & 1)
n >>= 1
return result
public class Solution {
public int ReverseBits(int n) {
int result = 0;
for (int i = 0; i < 32; i++) {
result = (result << 1) | (n & 1);
n >>= 1;
}
return result;
}
}
var reverseBits = function(n) {
let result = 0;
for (let i = 0; i < 32; i++) {
result = (result << 1) | (n & 1);
n >>>= 1; // 使用无符号右移
}
return result >>> 0; // 确保返回无符号32位整数
};
复杂度分析
| 复杂度类型 | 复杂度 | 说明 |
|---|---|---|
| 时间复杂度 | O(1) | 固定循环32次,与输入大小无关 |
| 空间复杂度 | O(1) | 只使用了常数级别的额外空间 |
相关题目
. Reverse Integer (Medium)
. Number of 1 Bits (Easy)