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 SequencesSingle 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

类似题目:

Number of 1 Bits

Reverse Integer

参考资料:

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)

https://leetcode.com/problems/reverse-bits/discuss/54738/Sharing-my-2ms-Java-Solution-with-Explanation

https://leetcode.com/problems/reverse-bits/discuss/54873/Java-two-methods-using-String-or-bit-operation-6ms-and-2ms-easy-understand

LeetCode All in One 题目讲解汇总(持续更新中...)

[LeetCode] 190. Reverse Bits 颠倒二进制位的更多相关文章

  1. [LeetCode] 190. Reverse Bits 翻转二进制位

    Reverse bits of a given 32 bits unsigned integer. For example, given input 43261596 (represented in ...

  2. 190 Reverse Bits 颠倒二进制位

    颠倒给定的32位无符号整数的二进制位.例如,给定输入 43261596(二进制表示为 00000010100101000001111010011100 ),返回 964176192(二进制表示为 00 ...

  3. LeetCode 190. Reverse Bits (算32次即可)

    题目: 190. Reverse Bits Reverse bits of a given 32 bits unsigned integer. For example, given input 432 ...

  4. LeetCode 190. Reverse Bits (反转位)

    Reverse bits of a given 32 bits unsigned integer. For example, given input 43261596 (represented in ...

  5. Java for LeetCode 190 Reverse Bits

    Reverse bits of a given 32 bits unsigned integer. For example, given input 43261596 (represented in ...

  6. Leetcode 190. Reverse Bits(反转比特数)

    Reverse bits of a given 32 bits unsigned integer. For example, given input 43261596 (represented in ...

  7. Java [Leetcode 190]Reverse Bits

    题目描述: everse bits of a given 32 bits unsigned integer. For example, given input 43261596 (represente ...

  8. Leetcode 190 Reverse Bits 位运算

    反转二进制 class Solution { public: uint32_t reverseBits(uint32_t n) { uint32_t ans = ; ; i<; ++i,n &g ...

  9. 【python】Leetcode每日一题-颠倒二进制位

    [python]Leetcode每日一题-颠倒二进制位 [题目描述] 颠倒给定的 32 位无符号整数的二进制位. 示例1: 输入: 00000010100101000001111010011100 输 ...

随机推荐

  1. LeetCode 430:扁平化多级双向链表 Flatten a Multilevel Doubly Linked List

    您将获得一个双向链表,除了下一个和前一个指针之外,它还有一个子指针,可能指向单独的双向链表.这些子列表可能有一个或多个自己的子项,依此类推,生成多级数据结构,如下面的示例所示. 扁平化列表,使所有结点 ...

  2. 如何让 C# 在运行时自动选择合适的重载方法?

    如题:假设我们有一段代码: static void Main(string[] args) { ; // 假设这里的 obj 的值来自于外部方法 PrintType(obj); } public st ...

  3. 解决前后端调用,跨域二次请求Access-Control-Max-Age

    发现前后端分离的项目中,前端发起一个请求到后端,在Chrome浏览器下面debug的时候,Network下面看到同一个url有两条请求,url有两条请求,第一条请求的Method为OPTIONS,第二 ...

  4. C# 协变、逆变

    微软官方概述: 在C#中,协变和逆变能够实现数组类型.委托类型和泛型类型参数的隐式引用转换.协变保留分配兼容性,逆变则与之相反. 协变:能够使用与原始指定的派生类型相比,派生程度更大的类型. 逆变:能 ...

  5. Retrofit的优点

    Retrofit的优点 可以配置不同HTTP client来实现网络请求,如okhttp.httpclient等 将接口的定义与使用分离开来,实现结构. 支持多种返回数据解析的Converter可以快 ...

  6. 第三方web ide开发环境下vuejs开发HMR环境搭建-码农这样开发是快乐的!

    vuejs是一个非常优秀的前端框架,利用该框架可以快速开发出任何web app,之所以vuejs开发非常高效快捷,其中最重要的一点就是利用webpakc提供的HMR(热模块替换)特性,可以边写vue组 ...

  7. CentOS 6.9安装MySQL 5.6 (使用yum安装)

    CentOS 6.9安装MySQL 5.6 (使用yum安装) 移除CentOS默认的mysql-libs [root@test01 srv]# whereis mysqlmysql: /usr/li ...

  8. Laravel 创建指定表 migrate

    解决方案:打开创建表的那个 migration 文件,在创建表的方法执行之前加一个判断条件 if (!Schema::hasTable('password_resets')) { Schema::cr ...

  9. Linux 的一些命令记录

    FTP:https://www.cnblogs.com/leoxuan/p/8329998.html YUM:https://blog.csdn.net/allyli0022/article/deta ...

  10. android studio学习----自动导包

    介绍一个最有用的设置,我们只有每次引用一些类的时候必须要导包,而Studio可以通过设置自动导包,简直太实用了. 到 Preferences -> Editor -> Auto Impor ...