leetcode with python:190. Reverse Bits

题目:

Reverse bits of a given 32 bits unsigned integer.

给定32位的unsigned integer,回传它反转后的值(十进位)
ex:input:00000010100101000001111010011100=>output:964176192(00111001011110000010100101000000)

这题就要用到其他我上次在位元运算(Bit Manipulations)一同学到的运算符号了
会用到的有&,>>
AND,即&是对二进位型态的两数的每一位进行比较
和^不同的是,该位两数都为1才会回传1,其余(0对0,1对0)都回传0
Right Shift,即>>,是将二进位型态的该数每一位元都往右移,然后在最左端补0
Left Shift,即<<,也是类似的道理

class Solution:    def reverseBits(self, n: int) -> int:        ans=0        for i in range(32):            if n&1:                ans=ans+2**(31-i)            n=n>>1        return ans

我们从用&1来判断最右位(第一位)是1还是0,是1会回传1,是0会回传0
是1的话我们要回传的值(ans)就要加2的31-n次方(n表第几次判断,即第几位数)
因为是reverse所以第一位要当最高位来算
每判断完一次就>>换下一位,总共执行32次(共32位)
最后回传ans即可
最后执行时间31ms(faster than 95.95%)

只要扯到字串,python永远不缺新奇解
分享一个我在讨论区看到的解法

class Solution:    def reverseBits(self, n: int) -> int:        n=bin(n)[2:]        n=(32-len(n))*"0"+n        return int(n[::-1],2)

先将unsigned integer变为二进位字串表示(将"0b"去掉)
然后看少了几个数在前端补0(补偿转换时消失的前端0)
上述两步骤其实就是快速将unsigned integer转为字串
之后再reverse转为int回传即可
最后执行时间20ms(faster than99.94%)

本题学习到的重点:位元运算(Bit Manipulations)之AND,Right Shift,Left Shift
那我们下题见


关于作者: 网站小编

码农网专注IT技术教程资源分享平台,学习资源下载网站,58码农网包含计算机技术、网站程序源码下载、编程技术论坛、互联网资源下载等产品服务,提供原创、优质、完整内容的专业码农交流分享平台。

热门文章