寻找两个出现奇数次的数——异或的使用
题目:
已知在一批数组中,两个值出现了奇数次,其他值都出现了偶数次,快速找出出现奇数次的两个数
代码及注释解析:
1 public static void FindTwoOddTimes(int[] arr) 2 { 3 int ans1 = 0,ans2 = 0; 4 int eor = 0; 5 for (int i = 0; i < arr.length ; i++) 6 { 7 eor ^= arr[i]; 8 } 9 10 //找出eor的最右端1位(这一位为1意味着出现奇数次的这两个值在这一位一个是0,一个是1,所以可以用这个作区分 11 //来分别找出这两个数) 12 int rightOne = eor & (~eor + 1);//eor与eor的补码相与即可获得其最右位为1其余位均为0的值 13 //如:eor为101100100,则通过该行得到000000100 14 15 for (int i = 0 ; i < arr.length; i++) 16 { 17 if ((arr[i] & rightOne) != 0) 18 { 19 ans1 ^= arr[i]; 20 } 21 else 22 { 23 ans2 ^= arr[i]; 24 } 25 } 26 System.out.println(ans1 + " "+ ans2); 27 }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧