用异或实现查找只出现一次的数字

这篇博客介绍了如何利用C语言中的异或运算来解决数组中只出现一次的数字问题。通过分析一个具体的例子,阐述了异或的性质,如a^a=0,a^0=a,以及结合律a^b^c=a^(b^c)。博主提出先将所有数组元素异或,得到的结果是两个只出现一次的数字的异或值。接着找到该值的第一个为1的二进制位,根据这一位将数组分为两部分,分别对两部分进行相同操作,最终得到两个唯一数字。
摘要由CSDN通过智能技术生成

C语言中我对按位异或这种运算不太懂,通过这道题熟悉了一些相关的运算以及基本性质。

题目如下:

一个数组中只有两个数字是出现一次,其他所有数字都出现了两次,请找出这两个数字。


首先对于这样一道题我是具体化分析比如这个数组就是{1,3,5,7,1,3,5,9},题目要求即找出只出现一次的数字即7和9。

之前在异或那边看过这样一道题,也算是这题目的简单版本,一个数组里面只有一个数字出现一次,其他都出现两次请找出这个数字。如何解决这样一道题?我之前想法就是用循环多次遍历,选出一个数比如叫a,再在剩下的数字里面遍历看是否有a相等的数字。这个比较繁琐,我们可以考虑用异或的性质解决,一个数字异或它自己结果为0,异或0结果为它自己即a^a=0,a^0=a,且异或满足a^b^c=a^(b^c)。因此我们可以设置一个ret异或每个数组元素,最后相同的都抵消为0,那个唯一的数字异或0为它自己即为答案。

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 8
    评论
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值