只出现一次的数

本文介绍了三种方法来解决数组中寻找只出现一次的数字的问题:利用异或操作、位运算和位计数。通过这些方法,可以有效地解决在数组中找到仅出现一次的元素的挑战。

<?php
error_reporting(0);
//数组中其他数字出现二次,而x出现一次 求x
function demo1(){
  $arr = array(1,2,3,2,1);
  $n = 0;
  for($i = 0; $i<count($arr);$i++)
  	$n ^=  $arr[$i];
  echo ($n);
}
//其他数字出现3次,x出现一次 求x
function demo2()  
{  
  $bits =array();	
  $arr = array(2, 3, 1, 2, 3, 4, 1, 2, 3, 1); 
  for($i = 0; $i<count($arr);$i++)  
    for ($j = 0; $j < 32; $j++)  
      $bits[$j] += ( ($arr[$i] >> $j) & 1);  
  // 如果某位上的结果不能被整除,则肯定目标数字在这一位上为  
   $result = 0;  
  for ($j = 0; $j < 32; $j++)  
    if ($bits[$j] % 3 != 0)  
      $result += (1 << $j);  
  echo $result;  
} 
//找出数组中两个只出现一次的数字
function demo3(){
    $arr = array(1,2,3,4,5,6,4,3,2,1);
    $ansXor=0;
    for($i = 0; $i<count($arr);$i++)  {
        $ansXor^=$arr[$i];               //异或
    }
    $pos=findFirstOne($ansXor);
    $num1=$num2=0;
    for($i = 0; $i<count($arr);$i++) {
        if(testBit($arr[$i],$pos))
            $num1^=$arr[$i];
        else
            $num2^=$arr[$i];
    }
    echo $num1.'  '.$num2  ;
}
function  findFirstOne($value){     //取二进制中首个为1的位置
    $pos=1;
    while(($value&1)!=1){
        $value=$value>>1;
        $pos++;
    }
    return $pos;
}
function  testBit($value,$pos){  //测试某位置是否为1
    return (($value>>$pos)&1);
}
demo3();


http://blog.youkuaiyun.com/morewindows/article/details/12684497

http://www.cnblogs.com/aLittleBitCool/archive/2011/04/14/2015720.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值