加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
文件
该仓库未声明开源许可证文件(LICENSE),使用请关注具体项目描述及其代码上游依赖。
克隆/下载
FindNumsAppearOnce.php 1.72 KB
一键复制 编辑 原始数据 按行查看 历史
star 提交于 2019-01-07 10:36 . 40-数组中只出现一次的数字
<?php
/**
* 数组中只出现一次的数字
* 一个整型数组里除了两个数字之外,其他的数字都出现了偶数次。请写程序找出这两个只出现一次的数字。
* 任何两个相同的数进行异或操作结果为0
* 当数只有一个只出现一次的数字时,对所有的数字亦或后的结果就是那个只出现一次的数字
* 当有两个时,对所有数字亦或后,亦或后的结果,就是两个只出现一次的两个不同数字的亦或结果,查看亦或结果的二进制倒数第一个为1的值的位置 如 亦或结果为0101,那么最后一个值为1的就是最后一个数,亦或因为,不同为1,那么这两个不同的值肯定为 xxxxxx1 与 xxxxx0 (不分先后顺序) ,所以将数组中的数字的二进制最后一个值为1与为0的数字,分为两组。然后分别对着两组进行亦或,每组的亦或结果就是那个只出现一次的数字
*/
function FindNumsAppearOnce($array)
{
if (!$array) {
return null;
}
$resultOR = OrMethods($array);
//倒数最后一个为1的位置
$EndIndex = 0;
while ($resultOR) {
if ($resultOR & 1) {
break;
}
$EndIndex++;
$resultOR = $resultOR>>1;
}
$firstArr = [];
$secondArr = [];
foreach ($array as $v) {
if (($v>>$EndIndex) & 1) {
$firstArr[] = $v;
} else {
$secondArr[] = $v;
}
}
$firstNum = OrMethods($firstArr);
$secondNum = OrMethods($secondArr);
var_dump($firstNum , $secondNum);
}
function OrMethods($array)
{
$resultOR = 0;
foreach ($array as $key => $value) {
$resultOR = $value ^ $resultOR;
}
return $resultOR;
}
$arr = [2,4,3,6,3,2,5,5];
FindNumsAppearOnce($arr);
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化