首页 > 其他 > 详细

LeetCode190:颠倒二进制(位运算分治! 时间复杂度O(1))

时间:2021-03-29 17:35:17      阅读:30      评论:0      收藏:0      [点我收藏+]

技术分享图片

 

技术分享图片

 解题思路:这道题很两种解法,常规的就是O(n),另一种就是巧妙的利用位运算实现分治,时间复杂度O(1),类似于归并排序。不过这个递归不是自顶向下,而是巧用位运算从自底向上实现。

比如01001000通过这种方法得到00010010

技术分享图片

 

class Solution:
    def reverseBits(self, n) -> int:
        m1 = int(10101010101010101010101010101010,2)
        m2 = int(11001100110011001100110011001100,2)
        m3 = int(11110000111100001111000011110000,2)
        m4 = int(11111111000000001111111100000000,2)
        m5 = int(11111111111111110000000000000000, 2)
    #自底向上
        n = ((n&m1)>>1) | ((n&(m1>>1))<<1)
        n = ((n&m2)>>2) | ((n&(m2>>2))<<2)
        n = ((n&m3)>>4) | ((n&(m3>>4))<<4)
        n = ((n&m4)>>8) | ((n&(m4>>8))<<8)
        n = ((n&m5)>>16)| ((n&(m5>>16))<<16)
        return n    

 

LeetCode190:颠倒二进制(位运算分治! 时间复杂度O(1))

原文:https://www.cnblogs.com/ISGuXing/p/14592920.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!