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

位运算经典应用 位运算经典应用 判断奇偶数 //一般写法,虽然编译器会自动优化成位运算 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

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

Labview实现服务器(server)与多客户端(clients)通信 服务器可以接收多个客户端发送的消息,并显示消息来源。 服务器可以发送消息到指定客户端 客户端可以自动连接服务器,断连后重连 客户端可以发送消息到服务器,可接收服务器消息 类似框架可以用做中央服务器及客户端项目 阅读详情

相关推荐

从原理图到代码:深入解析SX1278 LoRa模块与STM32的SPI通信驱动(附完整工程)

本文深入解析了SX1278 LoRa模块与STM32的SPI通信驱动实现,从硬件原理图到完整工程代码,详细介绍了LoRa技术的通信原理、寄存器配置、SPI接口设计及低功耗优化策略。适合物联网开发者和嵌入式工程师提升远距离无线通信能力,附完整工程代码助力快速开发。

weixin_42715608的博客 423

数组中只出现一次的数字

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

如是说的博客 4143

【coze实战】基于Coze的公众号图文自动化生成工作流实战解析

【coze实战】基于Coze的公众号图文自动化生成工作流实战解析

大家好,我是码农老gou,一名专注于编程技术的程序员。在这个博客中,我将与大家分享我在工作和学习中的经验、见解以及一些实用的技术干货。 1万+

位运算,数组

位运算,数组

m0_69985490的博客 315

linux下使用Ollama本地部署LLM

Ollama 是一个用于在本地运行大语言模型(如 Llama 2、Mistral、Gemma、Qwen 等)的工具,支持模型的拉取、运行、管理等功能。当你运行ollama。

u013218342的博客 1659

特斯拉 Model 3解析(八)全面拆解特斯拉自动驾驶大脑:AP控制器硬核技术解析

算力极限:双FSD = 144 TOPS,专为AI推理优化。存储架构:LPDDR4 + NAND + NOR,保证高速/可靠启动。通信架构:以太网传视频,CAN传控制,TSN保障实时性。感知输入:多路摄像头 + 高速SerDes,满足全景感知。电源设计:功率模块+被动元件海洋,稳定性优先。功能安全:双芯片冗余 + GPS + 紧急呼叫,容错率极高。🎯 在我看来,特斯拉AP控制器就是一台“车载超算”,它在电源设计、存储架构和功能安全上远超一般新势力方案。

weixin_43199439的博客 1438

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

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

CodePanda@GPF的博客 410

模拟IC版图DRC实战:手把手教你搞定MIM电容天线错误和ESD.10g违例

本文深入解析模拟IC版图中的MIM电容天线错误和ESD.10g违例问题,提供从错误解码到实战修复的完整指南。通过电路图修改、版图优化和验证闭环等步骤,帮助工程师高效解决DRC错误,特别适用于ADC等精密模拟电路设计。文章还分享了高级排错技巧和预防性设计策略,大幅提升流片成功率。

weixin_27697385的博客 293

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

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

weixin_42178670的博客 755

实战优化!C#上位机串口通信卡顿问题:超时机制+数据缓存方案

串口名</param>/// <param name="baudRate">波特率

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 1063

SAP 批次管理(分割评估)

批次分割评估: 业务场景:企业要求各批次物料成本价格不一样。此时可以采用分割批次来实现不同成本 后台配置: (1)、激活分割评估 后台---物料管理----评估与科目设置---分割评估-----激活分割评估 (2)、配置分割评估 后台---物料管理----评估与科目设置---分割评估-----配置分割评估 进入全局性分类后,批次分割采用已有的评估类型“X自动(批)”: ...

willieyuan的博客 1万+

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

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

weixin_35912261的博客 413

2025年开源气象大模型的实现原理与实践指南

气象大模型在人工智能时代实现了革命性突破,通过深度学习技术以更低的计算成本达到甚至超越传统数值天气预报的精度。开源气象大模型的出现使得全球研究者和机构都能参与气象AI的创新。本文详细解析了开源气象大模型的实现原理,包括核心架构、数据准备、训练方法和实际预测流程,并提供了实践指南。核心架构主要采用Transformer、图神经网络和扩散模型,处理多模态数据融合和时空联合建模。数据体系构建涉及数据来源、预处理和增强策略。模型训练关键技术包括损失函数设计、分布式训练优化和训练过程监控。微调与领域适应策略包括迁移学

专注AI大模型,软件混淆,授权 1179

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

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

颜的博客 2659

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

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

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

weixin_30933531的博客 141

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

位运算

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

SIOFive的专栏 1281

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

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、付费专栏及课程。

余额充值