Leetcode演算法修煉(五)只出現一次的數字

2021-09-25 16:38:24 字數 2168 閱讀 5229

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

說明:

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

示例 1:

輸入:[2,2,1]輸出:1
示例 2:

輸入:[4,1,2,1,2]輸出:4
這個題目第一眼看,嗯,很簡單呢,跟上一題目好像產不多似的。然而題目的要求不一樣這一次的題目要求使用線性時間複雜度,並且最好不使用額外的儲存空間,就遍歷操作至多執行一遍,並且不建立新的物件或者陣列。

那麼我首先想到了js陣列的indexof方法和lastindexof方法,可以獲取陣列元素第一次出現和最後一次出現時的索引,因此只需要判斷兩者的值是否相同即可。**如下:

let length=nums.length;

for(let i=0;i但是我提交答案之後發現執行時間以外的非常長,大概400-500ms,這不像是乙個陣列的線性操作所需的事件,所以我們想到indexof方法可能在內部的實現也是需要遍歷操作的,實際上是js作者幫我們完成了第二層的遍歷操作,那麼我認為這個解法並不是乙個好的解決方案,但是我想了很久也沒有想出乙個真正滿意的解法。

於是無奈的檢視的其他同學的解法,解法如下:

let count=0;

let a = 0;

for(let index = 0;index首先我懵逼了,這個^符號是什麼運算子來著?,我想了5秒想起來這是邏輯運算子異或,異或運算子的意思就是,運算子兩邊的值是相同的(都為真或者都為假),那麼運算結果為假(false、0),否則運算結果為真(true、1),如下:

true^true  -->false

false^false-->false

true^false-->true

false^true-->true

//或者

1^1-->0

0^0-->0

1^0-->1

0^1-->1

即兩個值相等的到false或者0,否則得到true或者1。

但是我們只了解這些仍然無法理解上面給出的演算法,我們還需要理解乙個操作叫做按位異或

首先我們知道計算機中的所有資料在記憶體中最終都是以二進位制進行儲存的,二進位制就是計算機能夠理解解釋的語言。那麼把我們常用的數字轉化為二進位制是什麼樣的呢?舉例如下:

十進位制: 1 ,2,3,4,5,6,7,8

二進位制 :1,10,11,100,101,110,111,1000

二進位制即逢二進一的算術方法。

那麼什麼是按位異或呢,即比較兩個二進位制數字的每一位上的值,如

10^10=00;

11^11=00;

11^10=01;

11^01=10;

觀察上面的運算我們發現,相同的二進位制數字經過邏輯異或運算後得到的值都是0

再有:1^0^1=0

1^1^0=0

0^1^1=0

所以我們發現異或操作交換運算元的位置並不會影響運算結果

那麼我們既可以利用以上兩點解決這個演算法題目了。

首先,我們需要知道對數字進行異或操作實際上是對運算元對應的二進位制數字進行邏輯異或運算,

其次,我們根據題意知道陣列中只有乙個不重複的元素,其餘元素都出現兩次,這個其他元素出現兩次也是解題關鍵,正因此我們可以通過異或運算進行解題。

我們只需要假設陣列的順序為所有相同的元素都成對的排列在陣列的前面,最後是我們想要的不重複的元素,那麼對對每對相同數數字進行邏輯異或操作,那麼最後計算得的值永遠是0,而使用0對唯一不重複的元素執行異或操作仍然得到原來的值。

以上解法用到了以下幾點知識點:

1、邏輯異或的意義

2、邏輯異或運算元的順序不會影響運算結果(基本運算子的交換律)

3、任何數與0進行邏輯異或運算不會發生改變

Leetcode演算法修煉(四)存在重複

給定乙個整數陣列,判斷是否存在重複元素。如果任何值在陣列 現至少兩次,函式返回 true。如果陣列中每個元素都不相同,則返回 false。示例 1 輸入 1,2,3,1 輸出 true示例 2 輸入 1,2,3,4 輸出 false示例 3 輸入 1,1,1,3,3,4,3,2,4,2 輸出 tru...

Leetcode演算法修煉(七)加一

給定乙個由整數組成的非空陣列所表示的非負整數,在該數的基礎上加一。最高位數字存放在陣列的首位,陣列中每個元素只儲存單個數字。你可以假設除了整數 0 之外,這個整數不會以零開頭。示例 1 輸入 1,2,3 輸出 1,2,4 解釋 輸入陣列表示數字 123。示例 2 輸入 4,3,2,1 輸出 4,3,...

演算法題 LeetCode刷題(五)

資料結構和演算法是程式設計路上永遠無法避開的兩個核心知識點,本系列 演算法題 旨在記錄刷題過程中的一些心得體會,將會挑出leetcode等最具代表性的題目進行解析,題解基本都來自於leetcode官網 本文是第五篇。給定乙個非負整數陣列,你最初位於陣列的第乙個位置。陣列中的每個元素代表你在該位置可以...