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