当前位置: 首页 > news >正文

每天一道算法练习题--Day21 第一章 --算法专题 --- ----------位运算

我这里总结了几道位运算的题目分享给大家,分别是 136 和 137, 260 和 645, 总共加起来四道题。 四道题全部都是位运算的套路,如果你想练习位运算的话,不要错过哦~~

前菜

开始之前我们先了解下异或,后面会用到。

异或的性质
两个数字异或的结果a^b是将 a 和 b 的二进制每一位进行运算,得出的数字。 运算的逻辑是果同一位的数字相同则为 0,不同则为 1。

异或的规律:

  • 任何数和本身异或则为0
  • 任何数和 0 异或是本身
  • 异或运算满足交换律,即:a ^ b ^ c = a ^ c ^ b

OK,我们来看下这三道题吧。

136. 只出现一次的数字 1

题目大意是除了一个数字出现一次,其他都出现了两次,让我们找到出现一次的数。我们执行一次全员异或即可

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

复杂度分析
时间复杂度: O ( N ) O(N) O(N),其中 N 为数组长度。
空间复杂度: O ( 1 ) O(1) O(1)

137. 只出现一次的数字 2

题目大意是除了一个数字出现一次,其他都出现了三次,让我们找到出现一次的数。 灵活运用位运算是本题的关键。

Python3:

class Solution:def singleNumber(self, nums: List[int]) -> int:res = 0for i in range(32):cnt = 0  # 记录当前 bit 有多少个1**加粗样式**           bit = 1 << i  # 记录当前要操作的 bitfor num in nums:if num & bit != 0:cnt += 1if cnt % 3 != 0:# 不等于0说明唯一出现的数字在这个 bit 上是1res |= bitreturn res - 2 ** 32 if res > 2 ** 31 - 1 else res
  • 为什么 Python 最后需要对返回值进行判断?

如果不这么做的话测试用例是[-2,-2,1,1,-3,1,-3,-3,-4,-2] 的时候,就会输出 4294967292。 其原因在于 Python 是动态类型语言,在这种情况下其会将符号位置的 1 看成了值,而不是当作符号“负数”。 这是不对的。 正确答案应该是 - 4,-4 的二进制码是 1111…100,就变成 2^32-4=4294967292,解决办法就是 减去 2 ** 32 。

之所以这样不会有问题的原因还在于题目限定的数组范围不会超过 2 ** 32

JavaScript:

var singleNumber = function (nums) {let res = 0;for (let i = 0; i < 32; i++) {let cnt = 0;let bit = 1 << i;for (let j = 0; j < nums.length; j++) {if (nums[j] & bit) cnt++;}if (cnt % 3 != 0) res = res | bit;}return res;
};

复杂度分析
时间复杂度: O ( N ) O(N) O(N),其中 N 为数组长度。
空间复杂度: O ( 1 ) O(1) O(1)

上述感觉这种方法他没说清楚,特此补充完整,

方法二:依次确定每一个二进制位

思路与算法

在这里插入图片描述

细节

在这里插入图片描述

代码

class Solution {public int singleNumber(int[] nums) {int ans = 0;for (int i = 0; i < 32; ++i) {int total = 0;for (int num: nums) {total += ((num >> i) & 1);}if (total % 3 != 0) {ans |= (1 << i);}}return ans;}
}作者:LeetCode-Solution
链接:https://leetcode.cn/problems/single-number-ii/solution/zhi-chu-xian-yi-ci-de-shu-zi-ii-by-leetc-23t6/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

645. 错误的集合

和上面的137. 只出现一次的数字2思路一样。这题没有限制空间复杂度,因此直接 hashmap 存储一下没问题。 不多说了,我们来看一种空间复杂度 O ( 1 ) O(1) O(1)的解法。

由于和137. 只出现一次的数字2思路基本一样,我直接复用了代码。具体思路是,将 nums 的所有索引提取出一个数组 idx,那么由 idx 和 nums 组成的数组构成 singleNumbers 的输入,其输出是唯二不同的两个数。

但是我们不知道哪个是缺失的,哪个是重复的,因此我们需要重新进行一次遍历,判断出哪个是缺失的,哪个是重复的。

class Solution:def singleNumbers(self, nums: List[int]) -> List[int]:ret = 0  # 所有数字异或的结果a = 0b = 0for n in nums:ret ^= n# 找到第一位不是0的h = 1while(ret & h == 0):h <<= 1for n in nums:# 根据该位是否为0将其分为两组if (h & n == 0):a ^= nelse:b ^= nreturn [a, b]def findErrorNums(self, nums: List[int]) -> List[int]:nums = [0] + numsidx = []for i in range(len(nums)):idx.append(i)a, b = self.singleNumbers(nums + idx)for num in nums:if a == num:return [a, b]return [b, a]

复杂度分析
时间复杂度: O ( N ) O(N) O(N)
空间复杂度: O ( 1 ) O(1) O(1)

260. 只出现一次的数字 3

题目大意是除了两个数字出现一次,其他都出现了两次,让我们找到这个两个数。

我们进行一次全员异或操作,得到的结果就是那两个只出现一次的不同的数字的异或结果。

我们刚才讲了异或的规律中有一个任何数和本身异或则为0, 因此我们的思路是能不能将这两个不同的数字分成两组 A 和 B。 分组需要满足两个条件.

  • 两个独特的的数字分成不同组
  • 相同的数字分成相同组

这样每一组的数据进行异或即可得到那两个数字。

问题的关键点是我们怎么进行分组呢?

由于异或的性质是,同一位相同则为 0,不同则为 1. 我们将所有数字异或的结果一定不是 0,也就是说至少有一位是 1.

我们随便取一个, 分组的依据就来了, 就是你取的那一位是 0 分成 1 组,那一位是 1 的分成一组。 这样肯定能保证2. 相同的数字分成相同组, 不同的数字会被分成不同组么。 很明显当然可以, 因此我们选择是 1,也就是 说两个独特的的数字在那一位一定是不同的,因此两个独特元素一定会被分成不同组。

class Solution:def singleNumbers(self, nums: List[int]) -> List[int]:ret = 0  # 所有数字异或的结果a = 0b = 0for n in nums:ret ^= n# 找到第一位不是0的h = 1while(ret & h == 0):h <<= 1for n in nums:# 根据该位是否为0将其分为两组if (h & n == 0):a ^= nelse:b ^= nreturn [a, b]

复杂度分析
时间复杂度: O ( N ) O(N) O(N),其中 N 为数组长度。
空间复杂度: O ( 1 ) O(1) O(1)

在这里插入图片描述

方法二:位运算

思路与算法

在这里插入图片描述
在这里插入图片描述

代码

class Solution {public int[] singleNumber(int[] nums) {int xorsum = 0;for (int num : nums) {xorsum ^= num;}// 防止溢出int lsb = (xorsum == Integer.MIN_VALUE ? xorsum : xorsum & (-xorsum));int type1 = 0, type2 = 0;for (int num : nums) {if ((num & lsb) != 0) {type1 ^= num;} else {type2 ^= num;}}return new int[]{type1, type2};}
}作者:LeetCode-Solution
链接:https://leetcode.cn/problems/single-number-iii/solution/zhi-chu-xian-yi-ci-de-shu-zi-iii-by-leet-4i8e/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

相关文章:

每天一道算法练习题--Day21 第一章 --算法专题 --- ----------位运算

我这里总结了几道位运算的题目分享给大家&#xff0c;分别是 136 和 137&#xff0c; 260 和 645&#xff0c; 总共加起来四道题。 四道题全部都是位运算的套路&#xff0c;如果你想练习位运算的话&#xff0c;不要错过哦&#xff5e;&#xff5e; 前菜 开始之前我们先了解下…...

D1. LuoTianyi and the Floating Islands (Easy Version)(树形dp)

Problem - D1 - Codeforces 这是问题的简化版本。唯一的区别在于在该版本中k≤min(n,3)。只有在两个版本的问题都解决后&#xff0c;才能进行黑客攻击。 琴音和漂浮的岛屿。 洛天依现在生活在一个有n个漂浮岛屿的世界里。这些漂浮岛屿由n−1个无向航线连接&#xff0c;任意两个…...

rk3588移植ubuntu server

ubuntu server 18.04 arm版本. 1、使用qemu运行 安装qemu-system-aarch64 sudo apt install -y qemu-system-arm 2、下载ubuntu server Index of /releases/18.04.3 3、创建虚拟磁盘 qemu-img create ubuntuimg.img 40G 4、创建虚拟机 弹出界面&#xff0c;直接回车选…...

如何更好地刷力扣

之前刷力扣是一口气看很多题目&#xff0c;打算时不时看一会题解&#xff0c;逐渐熟悉套路&#xff0c;争取背过&#xff0c;最后就可以写出来了。我个人是背知识比较喜欢这种方法&#xff0c;但后来发现根本不适用 算法题本身就比较复杂&#xff0c;不经过实际写代码中的思考…...

上采样和下采样

首先&#xff0c;谈谈不平衡数据集。不平衡数据集指的是训练数据中不同类别的样本数量差别较大的情况。在这种情况下&#xff0c;模型容易出现偏差&#xff0c;导致模型对数量较少的类别预测效果不佳。 为了解决这个问题&#xff0c;可以使用上采样和下采样等方法来调整数据集…...

小猪,信息论与我们的生活

前言 动态规划是大家都熟悉与陌生的知识&#xff0c;非常灵活多变&#xff0c;我自己也不敢说自己掌握了&#xff0c;今天给大家介绍一道题&#xff0c;不仅局限于动态规划做题&#xff0c;还会上升到信息论&#xff0c;乃至于启发自己认知世界的角度 因为比较难&#xff0c;本…...

【鸿蒙应用ArkTS开发系列】- http网络库使用讲解和封装

目录 前言http网络库组件介绍http网络库封装创建Har Module创建RequestOption 配置类创建HttpCore核心类创建HttpManager核心类对外组件导出添加网络权限 http网络库依赖和使用依赖http网络库&#xff08;httpLibrary&#xff09;使用http网络库&#xff08;httpLibrary&#x…...

【Java零基础入门篇】第 ⑥ 期 - 异常处理

博主&#xff1a;命运之光 专栏&#xff1a;Java零基础入门 学习目标 掌握异常的概念&#xff0c;Java中的常见异常类&#xff1b; 掌握Java中如何捕获和处理异常&#xff1b; 掌握自定义异常类及其使用&#xff1b; 目录 异常概述 异常体系 常见的异常 Java的异常处理机制…...

计算职工工资

目录 问题描述 程序设计 问题描述 【问题描述】 给定N个职员的信息,包括姓名、基本工资、浮动工资和支出,要求编写程序顺序输出每位职员的姓名和实发工资(实发工资=基本工资+浮动工资-支出)。 【输入形式】 输入在一行中给出正整数N。随后N行,每行给出一位职员的信息,…...

2019年上半年软件设计师下午试题

试题四(共 15 分) 阅读下列说明和 C 代码&#xff0c;回答问题 1 至 3&#xff0c;将解答写在答题纸的对应栏内 【说明】 n 皇后问题描述为&#xff1a;在一个 n*n 的棋盘上摆放 n 个皇后&#xff0c;要求任意两个皇后不能冲突, 即任意两个皇后不在同一行、同一列或者同一斜…...

IS200TPROH1BCB用于工业应用和电力分配等。高压型隔离开关用于变电站

​ IS200TPROH1BCB用于工业应用和电力分配等。高压型隔离开关用于变电站 什么是隔离器&#xff0c;它与断路器有何不同 什么是隔离器&#xff0c;为什么要使用隔离器 隔离器是一种开关装置&#xff0c;它可以手动或自动操作&#xff0c;隔离一部分电能。隔离器可用于在无负载情…...

【MySql】数据库 select 进阶

数据库 数据库表的设计ER 关系图三大范式 聚合函数与分组查询聚合函数 (count、sum、avg、max、min)分组查询 group by fields....having....(条件) 多表联查内连接外连接&#xff08;左连接&#xff0c;右连接&#xff09;自连接子查询合并查询 UNION 数据库表的设计 ER 关系…...

CVPR 2023 | VoxelNeXt实现全稀疏3D检测跟踪,还能结合Seg Anything

在本文中&#xff0c;研究者提出了一个完全稀疏且以体素为基础的3D物体检测和跟踪框架VoxelNeXt。它采用简单的技术&#xff0c;运行快速&#xff0c;没有太多额外的成本&#xff0c;并且可以在没有NMS后处理的情况下以优雅的方式工作。VoxelNeXt在大规模数据集nuScenes、Waymo…...

本地使用3台centos7虚拟机搭建K8S集群教程

第一步 准备3台centos7虚拟机 3台虚拟机与主机的网络模式都是桥接的模式&#xff0c;也就是他们都是一台独立的“主机” &#xff08;1&#xff09;kebe-master的配置 虚拟机配置&#xff1a; 网络配置&#xff1a; &#xff08;2&#xff09;kebe-node1的配置 虚拟机配…...

NVIDIA CUDA驱动安装

1 引言 因为笔记本电脑上运行Milvus图像检索代码&#xff0c;需要安装CUDA驱动。电脑显卡型号是NVIDIA GeForce GTX 1050 Ti Mobile, 操作系统是Ubuntu 20.04&#xff0c;内核版本为Linux 5.15.0-72-generic。 2 CUDA驱动测试 参考网上的资料&#xff1a;https://blog.csdn.…...

python 从excel中获取需要执行的用例

classmethod def get_excel_data(cls, excel_name, sheet_name, case_numNone):"""读取excel文件的方法:param excel_name: 文件名称:param sheet_name: sheet页的名称:param case_name: 执行的case名称:return:"""def get_row_data(table, row)…...

Web3中文|乱花渐欲meme人眼,BRC-20总市值逼近10亿美元

现在的Web3加密市场&#xff0c;用“乱花渐欲meme人眼”来形容再合适不过了。 何为meme&#xff1f; “meme”这个词大概很多人都不知道如何正确发音&#xff0c;并且一看到它就会和狗狗币Dogecoin等联系在一起。那它究竟从何而来呢&#xff1f; Meme&#xff1a;[mi:m]&#x…...

盖雅案例入选「首届人力资源服务国际贸易交流合作大会20项创新经验」

近日&#xff0c;首届人力资源服务国际贸易交流合作大会顺利召开。为激励企业在人力资源服务贸易领域不断创新&#xff0c;加快培育对外贸易新业态、新模式&#xff0c;形成人力资源服务领域国际竞争新优势&#xff0c;大会评选出了「首届人力资源服务国际贸易交流合作大会20项…...

[论文笔记]SimMIM:a Simple Framework for Masked Image Modeling

文章地址&#xff1a;https://arxiv.org/abs/2111.09886 代码地址&#xff1a;https://github.com/microsoft/SimMIM 文章目录 摘要文章思路创新点文章框架Masking strategyPrediction headPrediction targetEvaluation protocols 性能实验实验设置Mask 策略预测头目标分辨率预…...

mysql从零开始(4)----索引/视图/范式

接上文 mysql从零开始&#xff08;3&#xff09; 索引 索引是在数据库表的字段上添加的&#xff0c;是为了提高查询效率存在的一种机制。一张表的一个字段可以添加一个索引&#xff0c;也可以多个字段联合起来添加索引。索引相当于一本书的目录&#xff0c;是为了缩小扫描范围…...

linux之kylin系统nginx的安装

一、nginx的作用 1.可做高性能的web服务器 直接处理静态资源&#xff08;HTML/CSS/图片等&#xff09;&#xff0c;响应速度远超传统服务器类似apache支持高并发连接 2.反向代理服务器 隐藏后端服务器IP地址&#xff0c;提高安全性 3.负载均衡服务器 支持多种策略分发流量…...

在rocky linux 9.5上在线安装 docker

前面是指南&#xff0c;后面是日志 sudo dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo sudo dnf install docker-ce docker-ce-cli containerd.io -y docker version sudo systemctl start docker sudo systemctl status docker …...

UDP(Echoserver)

网络命令 Ping 命令 检测网络是否连通 使用方法: ping -c 次数 网址ping -c 3 www.baidu.comnetstat 命令 netstat 是一个用来查看网络状态的重要工具. 语法&#xff1a;netstat [选项] 功能&#xff1a;查看网络状态 常用选项&#xff1a; n 拒绝显示别名&#…...

三体问题详解

从物理学角度&#xff0c;三体问题之所以不稳定&#xff0c;是因为三个天体在万有引力作用下相互作用&#xff0c;形成一个非线性耦合系统。我们可以从牛顿经典力学出发&#xff0c;列出具体的运动方程&#xff0c;并说明为何这个系统本质上是混沌的&#xff0c;无法得到一般解…...

【Java_EE】Spring MVC

目录 Spring Web MVC ​编辑注解 RestController RequestMapping RequestParam RequestParam RequestBody PathVariable RequestPart 参数传递 注意事项 ​编辑参数重命名 RequestParam ​编辑​编辑传递集合 RequestParam 传递JSON数据 ​编辑RequestBody ​…...

JAVA后端开发——多租户

数据隔离是多租户系统中的核心概念&#xff0c;确保一个租户&#xff08;在这个系统中可能是一个公司或一个独立的客户&#xff09;的数据对其他租户是不可见的。在 RuoYi 框架&#xff08;您当前项目所使用的基础框架&#xff09;中&#xff0c;这通常是通过在数据表中增加一个…...

[大语言模型]在个人电脑上部署ollama 并进行管理,最后配置AI程序开发助手.

ollama官网: 下载 https://ollama.com/ 安装 查看可以使用的模型 https://ollama.com/search 例如 https://ollama.com/library/deepseek-r1/tags # deepseek-r1:7bollama pull deepseek-r1:7b改token数量为409622 16384 ollama命令说明 ollama serve #&#xff1a…...

Java详解LeetCode 热题 100(26):LeetCode 142. 环形链表 II(Linked List Cycle II)详解

文章目录 1. 题目描述1.1 链表节点定义 2. 理解题目2.1 问题可视化2.2 核心挑战 3. 解法一&#xff1a;HashSet 标记访问法3.1 算法思路3.2 Java代码实现3.3 详细执行过程演示3.4 执行结果示例3.5 复杂度分析3.6 优缺点分析 4. 解法二&#xff1a;Floyd 快慢指针法&#xff08;…...

ThreadLocal 源码

ThreadLocal 源码 此类提供线程局部变量。这些变量不同于它们的普通对应物&#xff0c;因为每个访问一个线程局部变量的线程&#xff08;通过其 get 或 set 方法&#xff09;都有自己独立初始化的变量副本。ThreadLocal 实例通常是类中的私有静态字段&#xff0c;这些类希望将…...

react更新页面数据,操作页面,双向数据绑定

// 路由不是组件的直接跳转use client&#xff0c;useEffect&#xff0c;useRouter&#xff0c;需3个结合&#xff0c; use client表示客户端 use client; import { Button,Card, Space,Tag,Table,message,Input } from antd; import { useEffect,useState } from react; impor…...