找出数组中只出现一次的数(位运算的使用)

位运算经典应用 位运算经典应用 判断奇偶数 //一般写法,虽然编译器会自动优化成位运算 if(( n%2 ) == 1){ //n是个奇数 } //如果把 n 以二进制的形式展示的话,其实我们只需要判断最后一个二进制位是 1 还是 0 就行了,如果是 1 的话,代表是奇数,如果是 0 则代表是偶数 if(n & 1 == 1){ //n是个奇数 } 交换两个数 //传统代码 int temp = x; x = y; y = temp; //位运算,不需要额外的辅助变量 x = x ^ y; // 阅读详情

位运算的使用

题一:leetcode137 只出现一次的数字 II

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

采用统计出现次数的思想,重点是:当其出现三次应当当做其没有出现过。

两比特位即可标识三种状态,即两比特位即可标识数组中某元素出现0、1、2次三种状态。我们可以采用两个变量代表这两个比特位。这样做有一个好处:可以存储那个只出现一次的那个数值。

现在我们考虑数组中某元素的每个比特位的可能情况,即:

变量a变量b某元素的某个比特更新后的变量a更新后的变量b
00000
01001
10010
00101
01110
10200

上面考虑的是数组中某元素的某一个比特位可能的情况,数组中每个元素的每个比特位都进行上面情况的考虑,最终的变量b就是我们所求的那个只出现一次的数。

如果那个只出现一次的数出现了两次,那么最终的变量a就是那个只出现两次的数。

下面的代码我们考虑数组中所有元素出现5次,但只有一个数字出现1次。

nums = [1, 2, 4, 5] * 5 + [3] * 1

a, b, c = 0, 0, 0
for d in nums:
    a_ = (~a & b & c & d) + (a & ~b & ~c & ~d)
    b_ = (~a & ~b & c & d) + (~a & b & ~c & d) + (~a & b & ~c & ~d) + (~a & b & c & ~d)
    c_ = (~a & ~b & ~c & d) + (~a & b & ~c & d) + (~a & ~b & c & ~d) + (~a & b & c & ~d)
    a, b, c = a_, b_, c_
# 其中c就是只出现一次的数字3
print(a, b, c)
# 如果数字3出现2次,那么变量b就是这个只出现2次的数字
# 如果数字3出现3次,那么变量b和变量c就是这个只出现3次的数字
# 如果数字3出现4次,那么变量a就是这个只出现4次的数字

当然,我们可以在这道题的基础上继续延伸,比如数组中所有元素出现k次,只有一个元素出现n(0<n<k)次数,我们都可以采用上面的思路进行求解。当然我们需要的变量数量就需要m(2**m>=k)个。

题二:leetcode260 只出现一次的数字 III

给定一个非空整数数组,其中恰好有两个元素只出现一次,其余所有元素均出现两次。 找出只出现一次的那两个元素。

这题我们采用题一的思想是不可行的,因为我们所求的是两个数,两个数最终每个比特位上统计之后无法还原成两个数。

因为除了那个只出现一次的两个数,其余的数都出现了偶数次,所以我们可以采用两两抵消的思想进行,将出现偶数次的数字都抵消掉。如何才能让出现偶数次的数抵消掉呢?我们可以采用位的异或运算抵消掉出现偶数次的数。

最终,我们得到两个只出现一次的数的异或值,如何利用这个异或值得到最终的两个只出现一次的数呢?可以找到这个异或值为1的最位,然后通过这个位来区分两个数,通过遍历数组中所有的数,即可得到最终的只出现一次的两个数。

nums = [1, 2, 4, 5] * 2 + [3, 7]

tmp = 1
for num in nums:
    tmp ^= num

# 得到为1的最低位
# mask = 1
# while mask & tmp == 0:
#     mask <<= 1
mask = tmp & -tmp

x, y = 0, 0
for num in nums:
    if num & mask:
        x ^= num
    else:
        y ^= num
print(x, y)
# 如果上面出现奇数次的数只有一个,那么得到的x、y其中有一个为0

如上,我们通过这个方式即可求解类似的问题,只要出现偶数次数的数都可以采用异或抵消掉,然后即可通过两个或者一个出现奇数次的数的异或值,最终求解得到出现奇数次的两个数或者一个数。

STM32超声波避障小车硬件设计与实时测距实现 超声波测距是嵌入式系统中经典的环境感知技术,其原理基于声波在空气中的传播时间与距离的线性关系,通过精确计时实现非接触式距离测量。该技术具备成本低、抗光干扰强、算法简洁等优势,广泛应用于智能小车、机器人避障、液位监测等场景。工程落地的关键在于硬件信号完整性(如5V/3.3V电平匹配)、微秒级定时精度(依赖高稳定外部晶振与输入捕获模式)以及强干扰环境下的数据鲁棒性(需软硬协同滤波)。本文以STM32F103C8T6为平台,深入解析HC-SR04模块的时序闭环控制、TIM3输入捕获双沿测量、L298N电机状态机驱 阅读详情

相关推荐

数据结构:五岔路口交通管理红绿灯设计

我们可以知道这是一个“图”的着色问题,首先要考虑,为什么可行路线是13条?当然可以通过穷举得出,如果用公式:则是: 或者 因为一条路线必须包括一出一进两个方向 第一种答案的解法: 一、固定E为入口,则有C_4^1=4的可能; 二、除去E(因为E只有一个入向),剩下ABCD四个路口,然后因为C只有一个出方向,所以从剩下 的ABD中选择一个入口,即C_3^1; 三、再从剩下的三个出口任选

潘猫猫的世界 1万+

数组中只出现一次的数字

题目描述 一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。 方法一 最直接的方法就是利用HashMap,将map的键设置成数组中的数字,map的值设置为该键在数组中出现的次数,第一次遍历初始化map,第二次遍历获得两个只出现一次的值 /** * 方法一 HashMap * @param array * @param num1 * @pa...

如是说的博客 4143

应急响应-勒索病毒典型处置案例

服务器感染Globelmposter勒索病毒 事件背景 2020年5月,某公司内外服务器遭遇勒索病毒攻击,应急响应工程师在抵达现场后,对包含服务器在内的13太机器进行系统排查和日志分析。 事件处置 勒索病毒初步判定 首先,对其中一台感染勒索病毒的主机A(源地址为192.168.111.129)进行排查,通过勒索信确认为GlobeImposter勒索病毒,如图所示。 在本地桌面及磁盘发现加密文件后缀为.RESERVE,如图所示。 系统排查 主机账号 通过

qq_50765147的博客 2458

位运算,数组

位运算,数组

m0_69985490的博客 315

轴承寿命预测实战:手把手教你用IEEE PHM2012数据集训练模型(附Python代码)

本文详细介绍了如何利用IEEE PHM2012数据集构建轴承剩余寿命预测模型,从数据预处理、特征工程到LSTM模型训练与部署,提供了完整的Python代码实现。通过实战案例,帮助读者掌握预测性维护中的关键技术,提升工业设备的运行安全与效率。

weixin_29186249的博客 311

nvlddmkm事件ID14报错排查全指南:从找不到描述到显卡驱动崩溃

系统日志中的“无法找到描述”往往让人一头雾水,但这类提示其实隐藏着驱动故障的关键线索。Windows事件查看器通过事件源和ID记录系统异常,其中显卡驱动相关的内核模式驱动组件一旦超时失败,就会触发TDR机制,产生13、14、153等不同事件ID。理解这些ID的含义,比纠结“找不到描述”本身更重要。对于频繁出现的驱动崩溃问题,可以从日志频率和发生场景判断方向,再通过安全模式下彻底清理驱动、关闭冲突软件、检查供电和温度等步骤逐层定位。无论是游戏满载黑屏,还是睡眠唤醒后闪退,掌握NVIDIA驱动日志的解读逻辑,都

weixin_30545945的博客 406

数组中只出现一次的数字(三种不同的情况)

数组中只出现一次的数字(三种不同的情况)

CodePanda@GPF的博客 410

大数据领域数据产品的交通运输行业应用

您是否经历过早高峰被堵在桥上,看着导航显示“前方5公里缓行”却无能为力?是否见过货车司机绕远路导致成本飙升?这些“交通痛点”的背后,是传统交通管理依赖经验决策的局限。本文将聚焦“大数据数据产品”这一核心工具,从技术原理到实际应用,全面解析它如何为交通运输行业“开天眼”,解决从城市拥堵到物流效率的一系列难题。本文将按照“问题引入→概念拆解→技术原理→实战案例→应用场景→未来趋势”的逻辑展开,用生活化比喻降低理解门槛,用代码和数学模型提升专业性,最终帮您建立“大数据+交通”的完整认知框架。交通数据。

操作系统内核探秘的博客 236

寻找一个数字数组中只出现一次的数字

寻找一个数字数组中只出现一次的数字

weixin_42178670的博客 755

[Dify实战] 合同审阅助手:识别风险条款、生成修改建议-带绑定资源

摘要: Dify合同审阅助手通过AI技术提升合同审阅效率,快速识别风险条款并输出结构化修改建议。方案包括合同输入、关键条款识别、风险评级和报告生成流程,重点关注付款、责任限制等核心条款。采用分层风险分级(高/中/低)和"红线清单"机制,确保审阅标准化。实施建议先建立条款库和模板,通过样本测试优化模型,定期更新规则库。该方案可缩短审阅时间50%以上,提高风险识别准确率,最终实现法务经验的可复用沉淀。

技术小甜甜:传播可落地技术,帮助个人和企业降低解决真实场景问题的成本 595

YOLOv11改进策略【损失函数篇】| 引入Soft-NMS,提升密集遮挡场景检测精度,包括GIoU-NMS、DIoU-NMS、CIoU-NMS、SIoU-NMS、 EIou-NMS

传统的非极大值抑制(NMS)算法在目标检测中存在一个问题,即当一个物体的检测框与具有最高得分的检测框M有重叠(在预定义的重叠阈值内)时,会将该检测框的得分设置为零,从而导致该物体可能被遗漏,降低了平均精度。为了解决这个问题,作者提出了Soft-NMS算法。本文将YOLOv11默认的NMS修改成GIoU-NMSDIoU-NMSCIoU-NMSSIoU-NMSEIou-NMS。

Limiiiing的博客 4317

java 数组位运算_Java小知识点学习--------数组和位运算小知识点

位运算符:>>>无符号右移运算符,无符号右移的规则和右移的规则同样,仅仅是在填充时,无论原来是正数还是负数都用0来补充。数组:arr1=arr2; 此时两个数组变量都会同一时候指向同样的数组,即arr2所指向的数组,假设arr2所指向的数组发生变化,则arr1和arr2都变化。使用Arrays.sort进行排序(使用的是快排)幻方矩阵:(直接给实例)public class m...

weixin_35912261的博客 413

在RStudio中使用GitHub Copilot:代码自动生成,从此告别手敲!

可以通过自定义提示词来引导Copilot生成符合自己需求的代码。再看一个做统计分析的。

Codewar的博客 330

Java位运算之2的N次幂、整数转换、寻找只出现一次的数

Java位运算 位运算:只能对整数进行位运算,可加快计算机计算速度。因为所有数在内存中都是以二进制存放,故直接对数的二进制位进行操作非常快,比如乘法、除2操作:通过左右移二进制位即可,无需将数转为十进制后再通过加法完成(乘法本质是由加法实现的) Java位运算的简单实现: /* 位运算:加快计算效果,只能对整数进行位运算。因为所有数在内存中都是以二进制存放,故直接对数的二进制位进行操作非常快, 比...

颜的博客 2659

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

位运算-出现k次与出现一次

题目:数组中arr只有一个数出现了1次,其他的数都出现了k次,请输出这个只出现了一次的数。 思路:这道题目要求使用位运算实现,如果采用数据结构Map就会简单很多。解此题前先了解不进位加法的思想,比如两个二进制数10+10 进行不进位加法得到的结果是00(二进制),再比如10个51进行不进位加法结果也为00(十进制),这里就可以得出结论,如果K个相同的K进制数进行无进位加法,相加的结果一定是每一位...

weixin_30933531的博客 141

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

位运算

位运算是建立在计算机的二进制基础上的,适当的运用位运算,可以将有些题目简化,得到答案。 这是昨晚偶然看到的两个题目: 1. 给你n个数,其中有且仅有一个数出现了奇数次,其余的数都出现了偶数次。用线性时间常数空间找出出现了奇数次的那一个数。 2. 给你n个数,其中有且仅有两个数出现了奇数次,其余的数都出现了偶数次。用线性时间常数空间找出出现了奇数次的那两个数。 本人语言表达能

SIOFive的专栏 1281

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

java实现 一个数组中只有一个数仅出现了一次,剩下的都出现了K次,求只出现了一次的那个数

此题我用的是位运算求解,实际上也可以用哈希表,构成键值对求解~ 步骤都在注释里,有问题欢迎留言交流 忽略类名…实在想不到啥英语 public class JinZhiMiaoYong { public static void main(String[] args) { /** * 思路: * 1)将数组中的每一个数转换为K进制 * 2)逐个相加。因为是不进位加法,所以需要...

菜鸟的进阶之路 635

位运算——小白的入门学习笔记

一.符号认知: &——按位与 |——按位或 ^——按位异或 二.基本方法: x&(x-1) 消去最后一位1 x&(x-1)==0 判断是否为2的幂次数(2的幂次数只有一个1,去掉就变成0) while(x!=0) {x = x&(x-1);b++;} 判断有多少个1 例题代码1: import java.util.Scanner; //常用方法 public class WeiYunSuan { public static void F0(int x)

weixin_44919936的博客 266

【c语言】 给一组数,有两个数只出现了一次,其他所有数都是成对出现的。找出这两个数

// 给一组数,有两个数只出现了一次,其他所有数都是成对出现的。找出这两个数。 #include void find_two_diff(int arr[], int len, int *num1, int *num2)//设置两个返回型参数 { int i = 0; int ret = 0; int pos = 1; *num1 = 0; *num2 = 0; for (i =

zhaoyaqian552的专栏 735

【算法题】136 137 只出现一次的数,及其变种

力扣136 137

qq_33300570的博客 272

NC156 数组中只出现一次的数(其它数出现k次)

描述 给定一个长度为 n 的整型数组 arr 和一个整数 k(k>1) 。 已知 arr 中只有 1 个数出现一次,其他的数都出现 k 次。 请返回只出现了 1 次的数。 思路一:用hashMap存储每个数字出现的次数,最后遍历一下找出value出现一次的数字。 思路二:位运算 例子:arr={1,1,3,3,5},k=2; 那么转化为二进制 {1,1,11,11,101},统计每个二进制位上1的个数。 如果统计时不包含出现一次的那个数,那么一定是k的倍数,二进制最低位统计为5,倒数第二位统计为2,倒

weixin_45429720的博客 518

位运算的相关题目

位运算的相关题目

weixin_56961911的博客 3555

一组数据中只有一个数字出现了一次。其他所有数字都是成对出现的。 请找出这个数字。(使用位运算)

题目要求要用位运算,而且要找到不是单独出现的数据。此时我们可以想到异或的特性,一个数据异或上自己时的到0。所以所有成对的数据异或玩之后得到0,0再异或上单独的值(单身狗)就得到它本身。 下面是代码实现:int main() { int arr[] = { 1, 2, 3, 4, 1, 2, 3, 4, 5 }; int z = sizeof(arr) / sizeof(arr[0]

long0624的博客 310

一组数据中只有一个数字出现了一次。其他所有数字都是成对出现的,找出这个数字(使用位运算)

位运算包含按位与、按位或、按位异或、按位取反、左移和右移 按位与:&  1 & 1 = 1    1 & 0 = 0     0 & 1 =0    0 & 0 = 0 按位或:|  1 | 1 = 1    1 | 0 = 1     0 | 1 = 1    0 | 0 = 0 按位异或:^ 1 ^ 1 = 0    1 ^ 0 = 1     0 ^ 1 = 1   0 ^

sherry_zhe的博客 279

只出现一次的数字

一、需求 给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。 说明: 你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗? 示例 1: 输入: [2,2,1] 输出: 1 二、排序法 2.1 思路分析 首先我们将数组升序排序,因为重复的元素只会出现 2 次,因此可以消掉,那么最后剩下的元素就是只出现一次的数字; 2.2 代码实现 class Solution { public int singleNumb..

皮卡qiu~的博客 142

找到数组中唯一或者唯二的数

1、找出数组中唯一或者唯二的数 解题思路1、位运算 因为对于异或运算有:相同为0不同为1,举例说明: 5 ---》0 1 0 1 11---》1 0 1 1 然后 5 XOR 10 = 1110 那么利用这个,因为数组中的数据一样的会存在两个(单的数据先不管),那么这些数据两两异或必然会是0,也就是: a XOR a = 0 特别的: 0 XOR a = a 因此: int first = 0; for(int i = 0;i < N;i++) first = firs

c_living的博客 3283
上一篇: 生成数字矩阵表示的迷宫
下一篇: 求数组与下标所能够构成最大面积
Subson
博客等级 码龄12年 31粉丝 21原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值