leetcode_位运算 190.颠倒二进制位

news/2025/2/21 7:06:26

190. 颠倒二进制位

  • 颠倒给定的 32 位无符号整数的二进制位。

1. 字符串

class Solution:
    # @param n, an integer
    # @return an integer
    def reverseBits(self, n):
        res = "" # 创建一个保存结果的空字符串
        for b in str(bin(n))[2:]:
        	# 遍历n的二进制数
            res = b + res 
            # 把每一位从头部插入res
        while len(res) < 32:
            res += "0"
            
        return int(res, 2)
  • 执行过程:

    • 假设输入 n = 43261596(即二进制为00000010100101000001111010011100),反转过程如下:

    • 二进制字符串:bin(43261596) 得到 ‘0b10100101000001111010011100’,去掉 ‘0b’ 后得到 ‘10100101000001111010011100’

    • 反转字符串:遍历每一位,将其按顺序添加到 r 前面:

      • r = ‘0’
        r = ‘00’
        r = ‘000’
        r = ‘0000’
        (继续添加,直到所有位反转)
        最终得到r = ‘00111001011110000010100101000000’
    • 确保长度为 32 位:反转后的 r 已经是 32 位,所以无需额外填充0

    • 返回结果:将 r = ‘00111001011110000010100101000000’ 转换为整数,得到 964176192

  • 时间复杂度: O(n)

  • 空间复杂度: O(1)

2. 循环

class Solution:
    # @param n, an integer
    # @return an integer
    def reverseBits(self, n):
        result = 0
        for i in range(32):
            result <<= 1  
            # 左移 result 为 1 位
            result |= (n & 1)  
            # 将 n 的最低有效位加到 result 中
            n >>= 1  
            # n 右移 1 位
        return result
  • 执行过程:
    • 第1 步(i = 0):
      num = 43261596 = 00000010100101000001111010011100
      提取最低有效位:num & 1 = 0(最低位是 0)
      result = result << 1 = 0 << 1 = 0(将 result 左移一位,为下一位腾出空间)
      result |= 0 → result = 0(将提取的位加到 result 中)
      num >>= 1 → num = 21630798(右移 num,去掉最低位)

    • 第 2 步(i = 1):
      num = 21630798 = 0000001010010100000111101001110
      提取最低有效位:num & 1 = 0(最低位是 0)
      result = result << 1 = 0 << 1 = 0
      result |= 0 → result = 0
      num >>= 1 → num = 10815399

    • 第 3 步(i = 2):
      num = 10815399 = 000000101001010000011110100111
      提取最低有效位:num & 1 = 1(最低位是 1)
      result = result << 1 = 0 << 1 = 0
      result |= 1 → result = 1(将提取的 1 加到 result 中)
      num >>= 1 → num = 5407699

    • 第 4 步(i = 3):
      num = 5407699 = 00000010100101000001111010011
      提取最低有效位:num & 1 = 1(最低位是 1)
      result = result << 1 = 1 << 1 = 2
      result |= 1 → result = 3
      num >>= 1 → num = 2703849

    • 第 5 步(i = 4):
      num = 2703849 = 0000001010010100000111101001
      提取最低有效位:num & 1 = 1(最低位是 1)
      result = result << 1 = 3 << 1 = 6
      result |= 1 → result = 7
      num >>= 1 → num = 1351924

    • 第 6 步(i = 5):
      num = 1351924 = 000000101001010000011110100
      提取最低有效位:num & 1 = 0(最低位是 0)
      result = result << 1 = 7 << 1 = 14
      result |= 0 → result = 14
      num >>= 1 → num = 675962
      …(继续这个过程直到处理完所有 32 位)

    • 直到第 32 步:
      经过 32 次循环,num 会变成 0,result 存储了反转后的二进制值

  • 时间复杂度: O(32) = O(1)
  • 空间复杂度: O(1)

http://www.niftyadmin.cn/n/5860423.html

相关文章

线程与线程:从入门到放弃

引言 在计算机科学中&#xff0c;**线程**是操作系统能够进行运算调度的最小单位。它被包含在进程之中&#xff0c;是进程中的实际运作单位。一个进程可以拥有多个线程&#xff0c;这些线程共享进程的内存空间和资源&#xff0c;但每个线程拥有独立的执行栈和程序计数器。 本…

JUC并发—8.并发安全集合二

大纲 1.JDK 1.7的HashMap的死循环与数据丢失 2.ConcurrentHashMap的并发安全 3.ConcurrentHashMap的设计介绍 4.ConcurrentHashMap的put操作流程 5.ConcurrentHashMap的Node数组初始化 6.ConcurrentHashMap对Hash冲突的处理 7.ConcurrentHashMap的并发扩容机制 8.Concu…

第1章大型互联网公司的基础架构——1.11 消息中间件技术

消息队列&#xff08;Message Queue&#xff09;是分布式系统中最重要的中间件之一&#xff0c;在服务架构设计中被广泛使用。 1.11.1 通信模式与用途 消息中间件构建了这样的通信模式&#xff1a; 一条消息由生产者创建&#xff0c;并被投递到存放消息的队列中&#xff1b;…

使用Python和正则表达式爬取网页中的URL数据

在数据抓取和网络爬虫开发中&#xff0c;提取网页中的URL是一个常见的需求。无论是用于构建网站地图、分析链接结构&#xff0c;还是进行内容聚合&#xff0c;能够高效地从HTML文档中提取URL都是一个重要的技能。Python作为一种强大的编程语言&#xff0c;结合其正则表达式模块…

ubuntu22.04使用minikube安装k8s

ubuntu使用minikube安装k8s 准备工作安装步骤安装docker安装kubectl安装minikube导入相关镜像安装相关指令启动minikube服务 安装dashboard组件导入相关镜像创建服务账号安装组件本体验证安装结果 准备工作 下载离线安装包&#xff0c;安装包内容如下&#xff1a; 软件说明ki…

windows使用命令解压jar包,替换里面的文件。并重新打包成jar包,解决Failed to get nested archive for entry

有一个jar包&#xff0c;需要替换里面的文件&#xff0c;使用解压工具打开项目&#xff0c;然后找到对应的子包&#xff0c;再次打开&#xff0c;然后进行手工替换重新压缩成jar包后&#xff0c;发现启动服务报错Failed to get nested archive for entry。 使用下面的命令可实…

jmeter接口测试(一)

一、什么是接口测试&#xff1f;为什么要做接口测试&#xff1f; 接口测试&#xff1a;就是测试项目和项目之间&#xff0c;模块和模块之间&#xff0c;组件和组件之间的数据交互和权限鉴定&#xff08;鉴权&#xff09;。 前后端分离&#xff1a;前后端联调。mock模拟&#x…

搭建 Hadoop 3.3.6 伪分布式

搭建 Hadoop 3.3.6 伪分布式 IP 192.168.157.132 初始化操作 更改yum源 # 1_1.安装Wget yum install wget# 1_2.备份CentOS-Base.repo文件 mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo_bak# 2.下载阿里yum源配置 wget -O /etc/yum.repos.d/Cen…