持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第5天,点击查看活动详情
190. 颠倒二进制位 - 力扣(LeetCode) (leetcode-cn.com)
颠倒给定的 32 位无符号整数的二进制位。
提示:
- 请注意,在某些语言(如 Java)中,没有无符号整数类型。在这种情况下,输入和输出都将被指定为有符号整数类型,并且不应影响您的实现,因为无论整数是有符号的还是无符号的,其内部的二进制表示形式都是相同的。
- 在 Java 中,编译器使用二进制补码记法来表示有符号整数。因此,在 示例 2 中,输入表示有符号整数 -3,输出表示有符号整数 -1073741825。
示例 1:
输入:n = 00000010100101000001111010011100
输出:964176192 (00111001011110000010100101000000)
解释:输入的二进制串 00000010100101000001111010011100 表示无符号整数 43261596,
因此返回 964176192,其二进制表示形式为 00111001011110000010100101000000。
示例 2:
输入:n = 11111111111111111111111111111101
输出:3221225471 (10111111111111111111111111111111)
解释:输入的二进制串 11111111111111111111111111111101 表示无符号整数 4294967293,
因此返回 3221225471 其二进制表示形式为 10111111111111111111111111111111 。
提示:
输入是一个长度为 32 的二进制字符串
进阶: 如果多次调用这个函数,你将如何优化你的算法?
二、思路分析:
翻转的话有两种处理方式 一种 嘿嘿自然是用reverse函数啦 无论是字符串你用StringBuilder.reverse() 还是这里Integer.reverse() 都行哈哈
一种 是对称位置做翻转 但是这里要位运算 就需要 取数 然后赋值对应位 就很烦
还有一种就是栈 把数字一个个入栈 然后出栈就是反序 但是我们不可能为了这玩意 弄个deque 有什么原生能实现栈的东西吗 答案就是Integer本身 你可以一边从n低位取数 一遍从ans的低位append 入栈 这样最终n的低位数字会跑到ans的高位 实现反序
同样的 对于字符串反序 你当然也可以反序读取源字符串 从字符串末尾开始读 然后一个个append 到ans里边 ans一般是StringBuilder 这样就完事了
三、AC 代码:
public class Solution {
public int reverseBits(int n) {
// 从尾部添加二进制数 然后左移 特别有栈的味道哈哈
int ans = 0;
for(int i = 0 ; i < 32 ; ++i){
ans <<= 1;
// 注意 ! 这句必须放在第二句前边 否则 你最后一次就会多左移一位!
// 本意是下一次循环再放数的 但循环结束了 没机会了
ans += n & 1;
n >>= 1;
}
return ans;
}
}