資料結構基礎(一)--只出現一次的數字
阿新 • • 發佈:2021-12-12
給定一個非空整數陣列,除了某個元素只出現一次以外,其餘每個元素均出現兩次。找出那個只出現了一次的元素。
說明:
你的演算法應該具有線性時間複雜度。 你可以不使用額外空間來實現嗎?
示例 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