1. 程式人生 > 其它 >1.LeetCode只出現一次的數字

1.LeetCode只出現一次的數字

技術標籤:LeetCode演算法資料結構

題目:給定一個非空整數陣列,除了某個元素只出現一次以外,其餘每個元素均出現兩次。找出那個只出現了一次的元素。

你的演算法應該具有線性時間複雜度。 你可以不使用額外空間來實現嗎?

輸入: [4,1,2,1,2]
輸出: 4

知識點

異或運算子:數學符號⊕ 英文簡稱xor 程式符號^
異或算符的值:一真一假為真,其餘為假
滿足交換律,結合律,恆等律:p ⊕ 0 = p,歸零律:p ⊕ p = 0

0000 1111 (15)
0000 1111
------------
0000 0000

ES6新增加了兩個重要的 JavaScript 關鍵字: let 和 const。增加了for in和for of。

在 ES6 之前,JavaScript 只有兩種作用域: 全域性變數(在函式外宣告的變數) 與 函式內的區域性變數。var 關鍵字宣告的變數不具備塊級作用域的特性,它在 {} 外依然能被訪問到,可以先使用再宣告。
let 宣告的變數只在 let 命令所在的程式碼塊{} 內有效,需要先宣告再使用,let 定義的變數值可以修改。const 宣告一個只讀的常量,宣告時必須進行初始化,且初始化後值不可再修改。

for in迴圈遍歷的是陣列的鍵值(索引),而for of迴圈遍歷的是陣列的值。

思路:異或運算子滿足交換律和結合律
A ^ C ^ B ^ C ^ B ^ A ^ D
= A ^ A ^ B ^ B ^ C ^ C ^ D

= 0 ^ 0 ^ 0 ^ D
= 0 ^ D
= D

function singleNumber(nums) {
  let ans = 0;
  for(const num of nums) {
    ans ^= num;
  }
  return ans;
}