一个数组中,除了有两个数字只出现一次外,其他数字都出现两次,求出这两个出现一次的数字

本文介绍了一种使用异或运算寻找数组中仅出现一次的两个数字的方法。通过巧妙地利用异或特性,文章详细展示了如何将原始数组分割成两组,并分别找出这两组中的唯一数字。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

求出两个只出现一次的数字

  1. 首先,我们知道两个相同的数字进行异或操作时为0,如果题目里面只有一个数字出现一次的话,我们就可以直接对数组中的所有数字进行异或操作,最后得到的数字就是单独出现的那个数字,但是题目中给的是2个出现一次的数字,那我们尝试可以把这个数组拆分成两个数组,将两个出现一次的数字分到不同的组里面,在进行异或操作
<?php
$arr=array(1,1,2,2,3,3,4,5,4,5,7,6,7,6,8,9,9,8,10,12,11,12,10,100);
$result=0;   //先得到两个出现一次的数字异或的值,然后进行右移操作,
如果余数是1的话,那么这个bit位的1就是两个数字中的一个,而另外一个数
字,这个bit位就不可能是1了,所以我们可以根据这个标志来拆分数组。而两个

相同数字该位的值都是一样的(同为0,或同为1for($i=0;$i<count($arr);$i++){
        $result^=$arr[$i];  
    }
$index=0;   //index为右移的位数
while(($result%2)&1==0){
    $result>>1;
    $index++;
}
$num1=0;   //用于保存两个数字中的一个
$num2=0;
for($i=0;$i<count($arr);$i++){
    if(($arr[$i]>>$index)&1)  //如果为0,为一组
        $num1^=$arr[$i];
    else
        $num2^=$arr[$i];   //为1,为一组
}
echo "num1:",$num1,"<br />";  
echo "num2:",$num2;
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值