数据结构基础(1.1) -- 只出现一次的数字
给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。
说明:
你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗?
示例 1:
输入: [2,2,1]
输出: 1
示例 2:
输入: [4,1,2,1,2]
输出: 4
首先我想到的是将所有数据加入到一个hash表中,然后查询单值出现的次数,若返回一次的就是我们想要的结果,但是题目要求具有线性时间复杂度.故不满足要求.
<?php
function findone ($nums){
$arr = [];
for ($i = 0;$i<count($nums);$i++) {
$arr[$nums[$i]][]= $i;
}
foreach ($arr as $key => $value){
if (count($value) < 2) {
return $key;
}
}
}
var_dump(findone([2,2,1,3,2,3]))
?>
所以我们使用异或概念来解决问题
什么是异或呢
<?php
$a = 1;
$b = 4;
$c = 1;
$d = 4;
$e = 5;
$f = 6;
var_dump($a ^ $b); //int(5)
var_dump($a ^ $b ^ $c); //int(4)
var_dump($a ^ $b ^ $c ^ $d); //int(0)
var_dump($a ^ $b ^ $c ^ $d ^ $e); //int(5)
var_dump($a ^ $b ^ $c ^ $d ^ $e ^f); //int(5)
?>
让人迷茫, 居然用这种方式来比较, 也是没谁了
function findOne ($num){
return array_reduce($num,function($carry,$item){$carry ^ $item})
}
数组中的元素做位运算,若数组中的元素只出现两次则会被运算抵消,最终只剩下单次出现的值。
本文来自博客园,作者:best7l,转载请注明原文链接:https://www.cnblogs.com/best7l/p/15678681.html