力扣刷题记录整理——(十八)Bit Manipulation

文章目录

  • 前言
  • 一、预备知识
    • 1.位运算
  • 二、解题思路
    • 1.位运算
      • 136.single-number
      • 268.missing-number
      • 191.number-of-1-bits
      • 338.counting-bits
      • 190.reverse-bits
      • 371.sum-of-two-integers
      • 7.reverse-integer


前言

整理力扣刷题思路。

  • 语言:python
  • 题库:来自neetcode: link

一、预备知识

1.位运算

位运算是一种在整数的二进制表示上操作单个位的运算。在大多数编程语言中,包括Python,有7种基本的位运算:与(AND)、或(OR)、异或(XOR)、取反(NOT)、左移(LSHIFT)、右移(RSHIFT)以及无符号右移(无符号 RSHIFT,不过这在Python中并不直接支持)。下面是每种位运算的特性和示例:

  1. 与(AND)

    • 特性:对位进行AND运算,当两个相应的二进位都为1时,结果位才为1,否则为0。
    • 示例:5 & 3(0101 & 0011 -> 0001, 结果为1)
  2. 或(OR)

    • 特性:对位进行OR运算,当两个相应的二进位都为0时,结果位才为0,否则为1。
    • 示例:5 | 3(0101 | 0011 -> 0111, 结果为7)
  3. 异或(XOR)

    • 特性:对位进行XOR运算,当两个相应的二进位相异时,结果位才为1。
    • 示例:5 ^ 3(0101 ^ 0011 -> 0110, 结果为6)
  4. 取反(NOT)

    • 特性:对位进行NOT运算,将1变成0,0变成1。
    • 示例:~5 (~0101 -> 1010, 在8位整数上结果为-6,因为位模式表示的是补码)
  5. 左移(LSHIFT)

    • 特性:将一个数的所有位都向左移动指定的位数,高位丢弃,低位补0。
    • 示例:5 << 1(0101 << 1 -> 1010, 结果为10)
  6. 右移(RSHIFT)

    • 特性:将一个数的所有位都向右移动指定的位数。对于无符号数,低位丢弃,高位补0;对于有符号数,低位丢弃,高位补符号位(这取决于语言和系统,称之为算数右移)。
    • 示例:5 >> 1(0101 >> 1 -> 0010, 结果为2)

注意,Python中的右移是算数右移。

Python不直接支持无符号右移,但这在一些其他语言如Java中是存在的,其特性为:

  1. 无符号右移(无符号 RSHIFT)(不适用于Python):
    • 特性:与标准的右移(有符号右移)不同,无论正负,高位都补0。
    • 示例:在支持无符号右移的语言中,-5 >>> 1结果会把符号位视为普通位一样右移,并且高位补0。

位运算在计算机编程中非常有用,尤其是在需要直接操作整数的二进制表示时。它们通常用于图形编程、加密算法、优化代码性能、内存管理等领域,以及许多需要低层操作的系统编程任务。


二、解题思路

1.位运算

136.single-number

给你一个 非空 整数数组 nums ,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。

你必须设计并实现线性时间复杂度的算法来解决此问题,且该算法只使用常量额外空间。
link

class Solution:
    def singleNumber(self, nums: List[int]) -> int:
        ans = 0
        for num in nums:
            ans ^= num
        return ans

268.missing-number

给定一个包含 [0, n] 中 n 个数的数组 nums ,找出 [0, n] 这个范围内没有出现在数组中的那个数。
link

class Solution:
    def missingNumber(self, nums: List[int]) -> int:
        ans = len(nums)
        #相同的数异或结果为0,最后的结果即为数组中未出现的数
        for i,n in enumerate(nums):
            ans ^= i^n
        return ans

跟上一题其实是一样的

191.number-of-1-bits

编写一个函数,输入是一个无符号整数(以二进制串的形式),返回其二进制表达式中
设置位的个数(也被称为汉明重量)。
link

#解法1:
class Solution:
    def hammingWeight(self, n: int) -> int:
        cnt = 0
        while n:
            cnt += n&1
            n >>= 1
        return cnt

#解法2:        
class Solution:
    def hammingWeight(self, n: int) -> int:
        cnt = 0
        while n:
            cnt += 1
            n &= n-1
        return cnt

参考:link

338.counting-bits

给你一个整数 n ,对于 0 <= i <= n 中的每个 i ,计算其二进制表示中 1 的个数 ,返回一个长度为 n + 1 的数组 ans 作为答案。
link

class Solution:
    def countBits(self, n: int) -> List[int]:
        cnt = [0]*(n+1)
        for i in range(1,n+1):
            cnt[i] = cnt[i>>1] + (i&1)
        return cnt

190.reverse-bits

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

提示:

请注意,在某些语言(如 Java)中,没有无符号整数类型。在这种情况下,输入和输出都将被指定为有符号整数类型,并且不应影响您的实现,因为无论整数是有符号的还是无符号的,其内部的二进制表示形式都是相同的。
在 Java 中,编译器使用二进制补码记法来表示有符号整数。因此,在 示例 2 中,输入表示有符号整数 -3,输出表示有符号整数 -1073741825。
link

#解法1
class Solution:
    def reverseBits(self, n: int) -> int:
        res = ''
        for _ in range(32):
            #倒序加入二进制的每一位
            res += str(n&1)
            n >>= 1
        return int(res,2)

#解法2
class Solution:
    def reverseBits(self, n):
        n = (n >> 16) | (n << 16);
        #f:1111,c:1100,3:0011,a:1010,5:0101
        n = ((n & 0xff00ff00) >> 8) | ((n & 0x00ff00ff) << 8);
        n = ((n & 0xf0f0f0f0) >> 4) | ((n & 0x0f0f0f0f) << 4);
        n = ((n & 0xcccccccc) >> 2) | ((n & 0x33333333) << 2);
        n = ((n & 0xaaaaaaaa) >> 1) | ((n & 0x55555555) << 1);
        return n

参考:link

371.sum-of-two-integers

给你两个整数 a 和 b ,不使用 运算符 + 和 - ​​​​​​​,计算并返回两整数之和。
link

class Solution:
    def getSum(self, a: int, b: int) -> int:
        a &= 0xffffffff
        b &= 0xffffffff
        while b:
            #按位加法,a保存对应位置为0、1的相加结果,也即1
            #b保存两者皆为1的相加结果,进位1
            a,b = a^b, (a&b) << 1 &0xffffffff
        return a if a<=0x7fffffff else ~(a^0xffffffff)

link

7.reverse-integer

给你一个 32 位的有符号整数 x ,返回将 x 中的数字部分反转后的结果。

如果反转后整数超过 32 位的有符号整数的范围 [−231, 231 − 1] ,就返回 0。

假设环境不允许存储 64 位整数(有符号或无符号)。
link

class Solution:
    def reverse(self, x: int) -> int:
        y,ans = abs(x),0
        check = 0x7fffffff if x>0 else 0x80000000

        while y:
            ans = ans*10 + y%10
            y //= 10
            if ans > check:
                return 0
        return ans if x>0 else -ans

link

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/593831.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

PG WAL日志理解

类似于oracle的redo log&#xff0c;用于数据库恢复&#xff0c;当一条SQL语句执行&#xff0c;PG会把对应的块放到缓冲区执行&#xff0c;&#xff0c;会写进WAL缓冲区会进行写操作&#xff0c;commit后&#xff0c;WAL writer进程进行写操作&#xff0c;把日志缓冲区WAL buff…

SpringData JPA - ORM 框架下,打造高效数据访问层

目录 一、SpringData JPA 概述 1.1、什么是 JPA 1.2、什么是 ORM 1.3、什么是 Hibernate 1.4、JPA 和 Hibernate 的关系 1.5、JPA 的优势 二、SpringData JPA 实战开发 2.1、依赖 2.2、配置文件 2.3、启动类 2.4、创建实体 2.5、基于 JpaRepository 的 CRUD 三、…

超市购物|基于SprinBoot+vue的超市购物系统(源码+数据库+文档)

目录 基于SprinBootvue的企业人事管理系统 一、前言 二、系统设计 三、系统功能设计 1商品管理 2公告管理 3公告类型管理 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源码获取&#xff1a; 博主介绍&#xff1a;✌️大厂码农|毕设…

C语言--带环链表问题

继续学习 一、判断链表是否带环 141. 环形链表 - 力扣&#xff08;LeetCode&#xff09; 思路&#xff1a;用快慢指针&#xff0c;快指针走两步&#xff0c;慢指针走一步&#xff0c;当慢指针走一半快指针进到环里 当慢指针进环&#xff0c;快指针已经在环中转了一会儿了 | |…

“字节跳动-文远知行杯”——广东工业大学第十四届程序设计竞赛

补题补题&#xff1a; A、hzy 和zsl 的生存挑战 题解&#xff1a;由于我们去考虑最优解&#xff0c;那么其中两人就应该是这样走法&#xff0c;一人选择相同数&#xff0c;另一人选择相反数&#xff0c;这样必会通关 #include <iostream> using namespace std;int main(…

Web服务器手动配置

目录 配置环境 http配置 配置步骤 1、首先安装Nginx&#xff08;已经安装的跳过这步&#xff09; 2、查看一下下Nginx的配置文件结构&#xff0c;了解如何配置&#xff0c;以及配置的各个条目有什么作用&#xff08;为接下来的配置打基础&#xff09; 3、创建你的网页 4、…

【银角大王——Django课程——靓号搜索实现/单独一篇】

搜索框功能实现 靓号搜索在Django框架中搜索功能实现——底层就是模糊查询添加一个搜索框&#xff0c;使用bootstrap框架将GO&#xff01;修改成一个放大镜靓号列表函数代码解释效果演示 靓号搜索 在Django框架中搜索功能实现——底层就是模糊查询 数字条件用法字符串条件用法…

学习如何使用PyQt5实现notebook功能

百度搜索“pyqt5中notebook控件”&#xff0c;AI自动生成相应例子的代码。在 PyQt5 中&#xff0c;QTabWidget 类被用作 Notebook 控件。以下是一个简单的示例&#xff0c;展示如何创建一个带有两个标签的 Notebook 控件&#xff0c;并在每个标签中放置一些文本。 import sys f…

电子信息工程专业就业前景怎么样

电子信息工程专业的就业前景十分广阔&#xff0c;主要得益于现代社会对信息技术的依赖不断加深以及科技的快速发展&#xff0c;以下是上大学网&#xff08;www.sdaxue.com&#xff09;对该专业就业前景的具体分析&#xff0c;供大家参考&#xff01; 行业需求广泛&#xff1a;随…

VBA字典与数组第十四讲:单列数组与单行数组间的运算

《VBA数组与字典方案》教程&#xff08;10144533&#xff09;是我推出的第三套教程&#xff0c;目前已经是第二版修订了。这套教程定位于中级&#xff0c;字典是VBA的精华&#xff0c;我要求学员必学。7.1.3.9教程和手册掌握后&#xff0c;可以解决大多数工作中遇到的实际问题。…

动态规划 ------ 背包问题

文章目录 1. 01 背包问题1.二维解决2. 一维优化 2. 完全背包问题1.暴力3 for.2. 二维优化3. 一维优化 3. 多重背包问题Ⅰ.1. 二维解决2. 一维优化 4. 多重背包问题Ⅱ5. 混合背包问题6. 二维费用背包问题7. 分组背包问题 背包问题是动态规划中非常典型的一些题&#xff0c;本篇文…

ctfshow——SSRF

文章目录 web 351web 352web 353web 354web 355web 356web357web 358web 359web 360 SSRF(Server-Side Request Forgery&#xff1a;服务器端请求伪造) 是一种由攻击者构造形成由服务端发起请求的一个安全漏洞。一般情况下&#xff0c;SSRF攻击的目标是从外网无法访问的内部系统…

同向双指针(滑动窗口)算法

209. 长度最小的子数组 这里的更新结果就题来定 class Solution {public int minSubArrayLen(int target, int[] nums) {int sum 0;int len 0;int f 0;for(int left 0, right 0; right < nums.length;){//求和sum nums[right];while(sum > target){//lenint t ri…

分布式锁之-redis

什么是分布式锁&#xff1f; 即分布式系统中的锁。在单体应用中我们通过锁解决的是控制共享资源访问的问题&#xff0c;而分布式锁&#xff0c;就是解决了分布式系统中控制共享资源访问的问题。与单体应用不同的是&#xff0c;分布式系统中竞争共享资源的最小粒度从线程升级成了…

JVM垃圾回收器G1大总结-详解

一、介绍: 1.停顿时间模型?? 作为CMS收集器的替代者和继承人&#xff0c;G1是基于“停顿时间模型”诞生的的垃圾收集器&#xff0c;停顿时间模型的意思是能够支持指定在一个长度为M毫秒的时间片段内&#xff0c;消耗在垃圾收集上的时间大概率不超过N毫秒这样的目标. 2.G1摒…

进程与线程(进程)

进程&#xff1a; 概念&#xff1a;进程是进程实体的运行过程&#xff0c;是系统进行资源分配和调度的一个独立单位 PID:当进程被创建时&#xff0c;操作系统会为该进程分配一个唯一的、不重复的“身份证号” 组成&#xff1a; PCB&#xff08;进程控制块&#xff09;&#…

使用AIGC生成软件类图表

文章目录 如何使用 AI 生成软件类图表什么是 MermaidMermaid 的图片如何保存&#xff1f;mermaid.liveDraw.io Mermaid可以画什么图&#xff1f;流程图时序图 / 序列图类图状态图甘特图实体关系图 / ER图 如何使用 AI 生成软件类图表 ChatGPT 大语言模型不能直接生成各类图表。…

W801学习笔记二十:宋词学习应用

前三章完成了唐诗的应用&#xff0c;本章将实现宋词的学习应用。 宋词与唐诗的区别不大&#xff0c;马上开始。 1、我们需要参考前面唐诗的方式&#xff0c;把宋词文本下载下来&#xff0c;并进行格式整理。 W801学习笔记十七&#xff1a;古诗学习应用——上 2、在菜单中添加…

电脑上的视频在电视上播放

视频右键->播放到设备->客厅电视 海信电视测试成功

BI不等同数据分析,别搞错了!

✅作者简介&#xff1a;《数据运营&#xff1a;数据分析模型撬动新零售实战》作者、《数据实践之美》作者、数据科技公司创始人、多次参加国家级大数据行业标准研讨及制定、高端企培合作讲师。 &#x1f338;公众号&#xff1a;风姑娘的数字视角&#xff0c;免费分享数据应用相…
最新文章