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

【中等】在其他数都出现偶数次的数组中找到出现奇数次的数-Java:进阶问题

分享一个大牛的人工智能教程。零基础!通俗易懂!风趣幽默!希望你也加入到人工智能的队伍中来!请轻击人工智能教程大家好!欢迎来到我的网站! 人工智能被认为是一种拯救世界、终结世界的技术。毋庸置疑,人工智能时代就要来临了,科… 继续阅读 前言https://www.captainai.net/troubleshooter

package live.every.day.ProgrammingDesign.CodingInterviewGuide.BitwiseOperation; /** * 在其他数都出现偶数次的数组中找到出现奇数次的数 * * 【题目】 * 给定一个整型数组arr,其中只有一个数出现了奇数次,其他的数都出现了偶数次,打印这个数。 * * 【进阶】 * 有两个数出现了奇数次,其他的数都出现了偶数次,打印这两个数。 * * 【要求】 * 时间复杂度为O(N),额外空间复杂度为O(1)。 * * 【难度】 * 中等 * * 【解答】 * 整数n与0异或的结果是1,整数n与整数n异或的结果是0。所以,先申请一个整型变量,记为eO。在遍历数组的过程中,把eO和每个数 * 异或(eO=eO^当前数),最后eO的值就是出现了奇数次的那个数。这是什么原因呢?因为异或运算满足交换律与结合律。为了方便说明, * 我们假设A,B,C这三个数出现了偶数次,D这个数出现了奇数次,并且出现的顺序为:C,B,D,A,A,B,C。因为异或运算满足交换 * 律和结合律,所以任意调整异或的顺序也不会改变最终eO的值,那么按照原始顺序异或得到的eO结果与按照如下顺序异或出的eO结果 * 是相同的:A,A,B,B,C,C,D。而按照这个顺序的异或最终结果就是D。也就是说,先异或还是后异或某一个数,对最终的结果是 * 没有任何影响的,最终结果等同于连续异或同一个出现偶数次的数之后,再连续异或下一个出现偶数次的数,等到所有出现偶数次的数 * 异或完,异或结果肯定是0,最后再去异或出现奇数次的数,最终结果自然是出现奇数次的数。所以对任何排列的数组,只要这个数组 * 有一个数出现了奇数次,另外的数出现了偶数次,最终异或结果都是出现了奇数次的数。 * 请参看printOddTimesNum1方法。 * * 如果只有a和b出现了奇数次,那么最后的异或结果eO就是a^b。所以,如果数组中有两个出现了奇数次的数,最终的eO一定不等于0。 * 那么肯定能在32位整数eO上找到一个不等于0的bit位,假设是第k位不等于0。eO在第k位不等于0,说明a和b的第k位肯定一个是1另 * 一个是0。接下来再设置一个变量记为eOhasOne,然后再遍历一次数组。在这次遍历时,eOhasOne只与第k位上是1的整数异或,其 * 他的数忽略。那么在第二次遍历结束后,eOhasOne就是a或者b中的一个,而eO^eOhasOne就是另外一个出现奇数次的数。 * 请参看printOddTimesNum2方法。 * * @author Created by LiveEveryDay */ public class InOtherNumAppearEvenArrayFindAppearOddNum2 { public static void printOddTimesNum2(int[] arr) { int eO = 0, eOhasOne = 0; for (int curNum : arr) { eO ^= curNum; } int rightOne = eO & (~eO + 1); for (int cur : arr) { if ((cur & rightOne) != 0) { eOhasOne ^= cur; } } System.out.println(eOhasOne + " " + (eO ^ eOhasOne)); } public static void main(String[] args) { int[] arr = {1, 2, 3, 3, 2, 8, 1, 6}; printOddTimesNum2(arr); } } // ------ Output ------ /* 6 8 */
http://www.jsqmd.com/news/696942/

相关文章:

  • 如何快速上手InstagramApiSharp:.NET平台的完整私人Instagram API指南
  • 2026年寻求河南钢筋加工设备制造企业,这类设备费用多少 - 工业设备
  • 半监督学习中的标签传播算法原理与实践
  • 如何配置Tern:终极编辑器集成配置教程
  • 客户体验管理从这里开始——可以做NPS用户满意度调查的网站,功能差异深度拆解 - 品牌排行榜
  • 快速部署MedGemma-X:体验对话式AI阅片,支持中文自然语言
  • DS4Windows终极指南:三步解决PS4手柄PC适配难题
  • 分析智能输送无人值守生产线,开元盛世的性价比怎么样? - 工业品牌热点
  • oh-my-codex:基于命令行的个人代码片段管理器,提升开发效率
  • Giraffe内容协商与流式传输:构建高效API的高级技巧
  • 3步搞定显卡驱动残留:Display Driver Uninstaller终极清理指南
  • Omni-Vision Sanctuary在YOLOv11生态中的角色:数据标注与模型优化建议生成
  • 机器学习特征选择的核心价值与Weka实战指南
  • 深入解析Stellar Core:从复制状态机到SCP共识的实战部署指南
  • 聊聊2026年智能输送无人值守生产线专业供应商,靠谱的有哪些 - myqiye
  • 算法正确性证明终极指南:数学归纳法与循环不变式实战应用
  • LLM数据分析智能体:架构设计与企业级实践
  • 文本向量化技术:从词嵌入到语义理解实战指南
  • 为什么Karafka是Rails应用的最佳Kafka集成方案?
  • Flux2-Klein-9B-True-V2惊艳效果:风格迁移+细节增强真实生成案例分享
  • 2026年智能输送无人值守生产线价格分析,怎么收费 - mypinpai
  • [数据集][目标检测]榴莲成熟度检测数据集VOC+YOLO格式2552张3类别
  • 手把手教你:在VMware Workstation 17上安装华为openEuler 22.03 LTS(附UKUI桌面安装教程)
  • spartan.ng测试策略:Jest单元测试与Cypress e2e测试最佳实践
  • Qwen3-4B-Instruct轻量部署方案:端侧AI落地低成本GPU算力适配实践
  • 程序员转型大模型全攻略:从基础到实战,小白也能轻松入门
  • 3步解锁NCM音频:从格式壁垒到自由播放的完整解决方案
  • APIKit对比分析:与其他API安全测试工具的差异化优势
  • AI编程助手实战:基于Claude API的项目级代码生成与协作开发
  • 从8个工作模态到零纹波:一张图看懂交错并联图腾柱PFC的CCM模式控制精髓