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

算法 | 基础 | 出现奇数次的数字

这里写自定义目录标题

  • 异或运算
  • 题目1
  • 题目2

本篇是关于异或(^)运算的运用。后期看算法过程中如果再碰到异或的都会收录到本篇中

异或运算

在逻辑学中,逻辑算符异或(exclusive or)是对两个运算元的一种逻辑析取类型,符号为 XOR 或 EOR 或 ⊕(编程语言中常用^)。但与一般的逻辑或不同,异或算符的值为真仅当两个运算元中恰有一个的值为真,而另外一个的值为非真。转化为命题,就是:“两者的值不同”或“有且仅有一个为真”

true ^ true = false
false ^ false = false
true ^ false = true
同理
1 ^ 1 = 0
0 ^ 0 = 0
1 ^ 0 = 1

且满足两个特性:交换律、结合律、归零律、恒等律

交换律:A ^ B = B ^ A
结合律:(A ^ B) ^ C = A ^ (B ^ C)
归零律:A ^ A = 0
恒等律:A ^ 0 = A

有了归零率和结合律,我们就可以轻松证明:

自反:A ^ B ^ B   =    A ^ 0   =    A

题目1

题目:给定一个数组,其中只有一个数出现奇数次,其他都出现偶数次,打印奇数次的数。
解法:结合律和归零律
例子int[] array = {1, 2, 2, 3, 3, 4, 4, 5, 5} 输出 1
思想

   a ^ b ^ c ^ a ^ d ^ b ^ c ^ d ^ e ^ e ^ e ^ f ^ f 
=  a ^ a ^ b ^ b ^ c ^ c ^ d ^ d ^ e ^ e ^ e ^ f ^ f //分组
=  0 ^ 0 ^ 0 ^ 0 ^ 0 ^ 0 ^ e ^ 0 //两两归零
=  e

代码

public class FindOddOccurrenceNumberUsingXOR {public static int findOddNumber(int[] arr) {int result = 0;for (int num : arr) {result ^= num;}return result;}public static void main(String[] args) {int[] array = {1, 2, 2, 3, 3, 4, 4, 5, 5};int oddNumber = findOddNumber(array);System.out.println("奇数个的数字是:" + oddNumber);}
}

题目2

题目:给定一个数组,其中有两个数出现奇数次,其他都出现偶数次,打印奇数次的数。
解法:结合律和归零律
例子int[] array = {1, 2, 2, 3, 3, 3, 4, 4, 5, 5} 输出 1,3
思想

   a ^ b ^ c ^ b
=  a ^ 0 ^ c //两两归零
=  a ^ c
=  x

知道这两个值异或的结果,如何知道两个值呢?自反
A ^ B ^ B = A
对于X转成二进制后,我们知道肯定有一位是1,因为x = a ^ c那么这一位为1的数不是a就是c仅为其中1个,我们假设是a。那么对于整个数组所有数来说,就分了两个阵营。

该位置为1该位置为0
ac
de,n,f

最后一步判断:因为其他数字都是偶数个,所以^后都是0,只有基数个的数字c^才是1。这样就能获取到a和c的值了。

代码

public class FindTwoOddOccurrenceNumbers {public static int[] findTwoOddNumbers(int[] arr) {int xorResult = 0;for (int num : arr) {xorResult ^= num;}//xorResult最终的值是 5^1// 找到两个奇数个数字的异或结果中的某一位为 1 的位置,讲解如下:// 假如 xorResult = 5 = 101// 减1取反后:~(101-001) = 011// 再和101取&= 001;// 此种算法就是获取一个数的最右一位的1int rightmostSetBit = xorResult & (~(xorResult - 1));int firstNumber = 0;for (int num : arr) {//获取与(其中一个基数个数字)同位置都是1的数字if ((num & rightmostSetBit)== 1) {//其他数字都是偶数个,都是0,所以可以找到(其中一个基数个数字)firstNumber ^= num;}}//自反原则,xorResult ^ firstNumber = (5^1)^1 = 5;return new int[]{firstNumber, xorResult ^ firstNumber};}public static void main(String[] args) {int[] array = {4, 2, 4, 5, 2, 3, 3, 1};int[] result = findTwoOddNumbers(array);System.out.println("两个出现奇数次的数字是:" + result[0] + " 和 " + result[1]);}
}
http://www.lryc.cn/news/432556.html

相关文章:

  • log4j 控制台和文件输出乱码问题解决
  • 在国产芯片上实现YOLOv5/v8图像AI识别-【4.2】RK3588获取USB摄像头图像推流RTSP更多内容见视频
  • TCP/IP协议栈详解及其在现代网络中的应用
  • 亚信安全荣获“2024年网络安全优秀创新成果大赛”优胜奖
  • 如何从硬盘恢复已删除/丢失的文件?硬盘恢复已删除的文件技巧
  • [Linux]:权限
  • 启动Spring Boot报错
  • 部署project_exam_system项目——及容器的编排
  • 网络工程师学习笔记——无线通信网
  • Vue(十三) 路由、路由嵌套、query、param传参、propos、replace属性。编程式路由导航,特有的生命周期函数,路由守卫
  • ArgoUML与StarUML的安装
  • 828华为云征文|华为云服务器Flexus X搭建悟空crm管理系统——助力企业云上管理(解决APP Referer校验失败问题)
  • 计算机毕业设计选题推荐-健康健身追踪系统-运动健身系统-Java/Python项目实战
  • FPGA开发:初识FPGA × 开发环境
  • 电脑驱动分类
  • 理解C++全局对象析构顺序与 IPC 资源管理:避免 coredump
  • 云计算之大数据(下)
  • 硬件工程师笔试面试知识器件篇——二极管
  • 操作系统安全保护
  • STM32硬件篇:W25Q64
  • uni-app 获取当前位置的经纬度以及地址信息
  • 【CSS】尺寸单位
  • Agent(智能体)和 MetaGPT,一句话实现整个需求应用代码
  • [数据结构] 哈希结构的哈希冲突解决哈希冲突
  • Wimdows使用Appium IOS自动化
  • C语言深度剖析--不定期更新的第四弹
  • 【手撕数据结构】八大排序神功(上)
  • 【2024高教社杯全国大学生数学建模竞赛】B题模型建立求解
  • OpenHarmony鸿蒙开发( Beta5.0)智能手表应用开发实践
  • 共享单车轨迹数据分析:以厦门市共享单车数据为例(一)