声明:
今天是第45道题。颠倒给定的 32 位无符号整数的二进制位。以下所有代码经过楼主验证都能在LeetCode上执行成功,代码也是借鉴别人的,在文末会附上参考的博客链接,如果侵犯了博主的相关权益,请联系我删除
(手动比心ღ( ´・ᴗ・` ))
正文
题目:颠倒给定的 32 位无符号整数的二进制位。
示例:
输入: 43261596 输出: 964176192 解释: 43261596 的二进制表示形式为 00000010100101000001111010011100 , 返回 964176192,其二进制表示形式为 00111001011110000010100101000000 。
进阶:
如果多次调用这个函数,你将如何优化你的算法?
解法1。 利用format函数将输入n转为32位无符号二进制数,再逆转,用int函数转为10进制数并返回。耗时28 ms, 在Reverse Bits的Python提交中击败了94.94% 的用户,代码如下。
class Solution:
# @param n, an integer
# @return an integer
def reverseBits(self, n):
# 先用format函数把n转为1个32位的无符号二进制数,用list存放
n_2 = list('{:032b}'.format(n))
# 然后逆转这个二进制数
len_n = len(n)
for i range(len_n):
n_2[i], n_2[len_n-1-i] = n_2[len_n-1-i], n_2[i]
# n_2此时还是1个list,应该转为1个完整的字符串
n_rev = ''.join(n_2)
# 把字符串强制转换为int整型数字并返回,注意这里n_rev是2进制数,所以要指定base为2,不然默认认为是10进制数了
return int(n_rev, 2)
解法2。其实还有更简化的方法,思路、效率和上面一样,但不知道鲁棒性如何。上面的方法其实有点绕,str转list,然后又转str,下面这种方法,只利用str的特性。耗时28 ms, 在Reverse Bits的Python提交中击败了94.94% 的用户,代码如下。
class Solution:
# @param n, an integer
# @return an integer
def reverseBits(self, n):
n_2 = '{:032b}.format(n)'
n_2 = n_2[::-1]
return int(n_2, 2)
解法3。除了用format函数将10进制转为2进制外,还有bin函数,只是bin函数只把10进制转为2进制,不会自动补位成32位,且用‘0b’开头,所以多1步操作,耗时28 ms, 第1种解法在Reverse Bits的Python提交中击败了94.94% 的用户,第2种解法耗时24 ms, 在Reverse Bits的Python提交中击败了99.92% 的用户,代码如下。
class Solution:
# @param n, an integer
# @return an integer
def reverseBits(self, n):
# 解法3 V 1.0:步步为营的版本
n_2 = bin(n)[2:] # [:2]是‘0b’,不取
len_n_2 = len(n_2)
n_2 = '0'*(32-len_n_2) + n_2 # 在此最高位补0补成32位
n_2 = n_2[::-1]
return int(n_2,2)
# 解法3 V 2.0:一步到位的版本
return int(bin(n)[2:].zfill(32)[::-1], 2)
结尾
解法1:https://blog.csdn.net/qq_34364995/article/details/80544458
解法2:原创
解法3:https://blog.csdn.net/ma412410029/article/details/80528252 https://www.cnblogs.com/MartinLwx/p/9695441.html