[LeetCode] 190. Reverse Bits 颠倒二进制位
Reverse bits of a given 32 bits unsigned integer.
Example 1:
Input: 00000010100101000001111010011100
Output: 00111001011110000010100101000000
Explanation: The input binary string 00000010100101000001111010011100 represents the unsigned integer 43261596, so return 964176192 which its binary representation is 00111001011110000010100101000000.
Example 2:
Input: 11111111111111111111111111111101
Output: 10111111111111111111111111111111
Explanation: The input binary string 11111111111111111111111111111101 represents the unsigned integer 4294967293, so return 3221225471 which its binary representation is 10101111110010110010011101101001.
Note:
- Note that in some languages such as Java, there is no unsigned integer type. In this case, both input and output will be given as signed integer type and should not affect your implementation, as the internal binary representation of the integer is the same whether it is signed or unsigned.
- In Java, the compiler represents the signed integers using 2's complement notation. Therefore, in Example 2 above the input represents the signed integer
-3
and the output represents the signed integer-1073741825
.
Follow up:
If this function is called many times, how would you optimize it?
Credits:
Special thanks to @ts for adding this problem and creating all test cases.
这道题又是在考察位操作 Bit Operation,LeetCode 中有关位操作的题也有不少,比如 Repeated DNA Sequences,Single Number, Single Number II ,和Grey Code 等等。跟上面那些题比起来,这道题简直不能再简单了,我们只需要把要翻转的数从右向左一位位的取出来,如果取出来的是1,将结果 res 左移一位并且加上1;如果取出来的是0,将结果 res 左移一位,然后将n右移一位即可,参见代码如下:
解法一:
class Solution {
public:
uint32_t reverseBits(uint32_t n) {
uint32_t res = ;
for (int i = ; i < ; ++i) {
if (n & == ) {
res = (res << ) + ;
} else {
res = res << ;
}
n = n >> ;
}
return res;
}
};
我们可以简化上面的代码,去掉 if...else... 结构,可以结果 res 左移一位,然后再判断n的最低位是否为1,是的话那么结果 res 加上1,然后将n右移一位即可,代码如下:
解法二:
class Solution {
public:
uint32_t reverseBits(uint32_t n) {
uint32_t res = ;
for (int i = ; i < ; ++i) {
res <<= ;
if ((n & ) == ) ++res;
n >>= ;
}
return res;
}
};
我们继续简化上面的解法,将 if 判断句直接揉进去,通过 ‘或’ 上一个n的最低位即可,用n ‘与’ 1提取最低位,然后将n右移一位即可,代码如下:
解法三:
class Solution {
public:
uint32_t reverseBits(uint32_t n) {
uint32_t res = ;
for (int i = ; i < ; ++i) {
res = (res << ) | (n & );
n >>= ;
}
return res;
}
};
博主还能进一步简化,这里不更新n的值,而是直接将n右移i位,然后通过 ‘与’ 1来提取出该位,加到左移一位后的结果 res 中即可,参加代码如下:
解法四:
class Solution {
public:
uint32_t reverseBits(uint32_t n) {
uint32_t res = ;
for (int i = ; i < ; ++i) {
res = (res << ) + (n >> i & );
}
return res;
}
};
我们也可以换一种角度来做,首先将n右移i位,然后通过 ‘与’ 1来提取出该位,然后将其左移 (32 - i) 位,然后 ‘或’ 上结果 res,就是其颠倒后应该在的位置,参见代码如下:
解法五:
class Solution {
public:
uint32_t reverseBits(uint32_t n) {
uint32_t res = ;
for (int i = ; i < ; ++i) {
res |= ((n >> i) & ) << ( - i);
}
return res;
}
};
讨论:这道题的最高票解法实在是很叼啊,参见这个帖子,但是博主没有太理解啊,希望哪位大神能讲解一下哈~
Github 同步地址:
https://github.com/grandyang/leetcode/issues/190
类似题目:
参考资料:
https://leetcode.com/problems/reverse-bits/
https://leetcode.com/problems/reverse-bits/discuss/54938/A-short-simple-Java-solution
https://leetcode.com/problems/reverse-bits/discuss/54772/The-concise-C++-solution(9ms)
https://leetcode.com/problems/reverse-bits/discuss/54741/O(1)-bit-operation-C++-solution-(8ms)
LeetCode All in One 题目讲解汇总(持续更新中...)
[LeetCode] 190. Reverse Bits 颠倒二进制位的更多相关文章
- [LeetCode] 190. Reverse Bits 翻转二进制位
Reverse bits of a given 32 bits unsigned integer. For example, given input 43261596 (represented in ...
- 190 Reverse Bits 颠倒二进制位
颠倒给定的32位无符号整数的二进制位.例如,给定输入 43261596(二进制表示为 00000010100101000001111010011100 ),返回 964176192(二进制表示为 00 ...
- LeetCode 190. Reverse Bits (算32次即可)
题目: 190. Reverse Bits Reverse bits of a given 32 bits unsigned integer. For example, given input 432 ...
- LeetCode 190. Reverse Bits (反转位)
Reverse bits of a given 32 bits unsigned integer. For example, given input 43261596 (represented in ...
- Java for LeetCode 190 Reverse Bits
Reverse bits of a given 32 bits unsigned integer. For example, given input 43261596 (represented in ...
- Leetcode 190. Reverse Bits(反转比特数)
Reverse bits of a given 32 bits unsigned integer. For example, given input 43261596 (represented in ...
- Java [Leetcode 190]Reverse Bits
题目描述: everse bits of a given 32 bits unsigned integer. For example, given input 43261596 (represente ...
- Leetcode 190 Reverse Bits 位运算
反转二进制 class Solution { public: uint32_t reverseBits(uint32_t n) { uint32_t ans = ; ; i<; ++i,n &g ...
- 【python】Leetcode每日一题-颠倒二进制位
[python]Leetcode每日一题-颠倒二进制位 [题目描述] 颠倒给定的 32 位无符号整数的二进制位. 示例1: 输入: 00000010100101000001111010011100 输 ...
随机推荐
- spring AOP XML解析
<aop:config> 标签的解析: <bean id="loggingAspect" class="com.zhuguang.jack.aop.as ...
- Centos7编译安装Nginx+keepalived
一.安装环境.主机信息及软件版本 Nginx:1.12.2keepalived:2.0.12时间同步(同步后确认各服务器时间是否一致,不一致需要修改一下时区) 关闭防火墙 二.编译安装Nginx 1. ...
- 搜索旋转排序数组II
题目 假设按照升序排序的数组在预先未知的某个点上进行了旋转. ( 例如,数组 [,,,,,,] 可能变为 [,,,,,,] ). 编写一个函数来判断给定的目标值是否存在于数组中.若存在返回 true, ...
- 常用的排列、组合、阶乘函数 MATLAB
1.求n的阶乘,方法如下:a.factorial(n)b.gamma(n+1)c.v='n!'; vpa(v) 2.求组合(数),方法如下:a.combntns(x,m) 列举出从n个元素中取出 ...
- Spring源码系列 — 容器Extend Point(一)
前言 前文介绍了Spring中的BeanDefinition的细节,随着Spring的启动流程,这节我们介绍Spring的后续处理过程 - Spring的扩展点: BeanFactoryPostPro ...
- 异步编程,await async入门
网上很多异步编程的文章,提供一篇入门: 异步编程模型 .net支持3种异步编程模式: msdn:https://docs.microsoft.com/zh-cn/dotnet/standard/asy ...
- Prism——Window 必须是树的根目录。不能将 Window 添加为 Visual 的子目录。
这个错误就是作为Region的view添加时选成了界面,正确的应在添加时选择用户控件. 解决方法: 这俩处的Window改为UserControl即可.
- POS时机未到,POW强攻是实现全球货币的正确道路
POS时机未到,POW强攻是实现全球货币的正确道路 取代现今的货币体系的正确进攻方式是POW强攻,现在的货币是由力量背书的,以后的货币也是由力量背书的,只有因造币耗费的力量超过了所有其它力量的时候才能 ...
- Ext.create方法分析
Ext.create方法实际上是Ext.ClassManager的instantiate的别名 分析如下: (function(Class, alias, arraySlice, arrayFrom, ...
- Invalid left-hand side in assignment
今天遇到一个问题,算不上什么技术问题,但是感觉这个坑值得记录一下 说一下我们的环境,我们的项目都是本地启动服务的,所以直接在idea中打开前端代码进行开发的 原来的前端的代码都是es5的没有使用过箭头 ...