每日一題 Leetcode 136

2021-10-06 03:53:26 字數 1006 閱讀 8373

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

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

輸入: [2,2,1]

輸出: 1

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

輸出: 4

這道題的難度值為easy,感覺更像是智力題。如果沒有對於空間限制的話,那這道題怎麼做基本都可以,畢竟犧牲空間就可以換取時間。正是這裡限制了空間利用,所以要稍微思考一下取一種巧妙的方法。

官方解答的思路很妙,巧用了異或運算。也就是說,相同的倆數會運算得到0,0和乙個非零數異或得到該數字。所以只需要將陣列中所有的數字一起異或運算,得到的值就是這乙個單獨的數字。

解法巧妙之餘,python對於個演算法的實現更是簡潔,直接一行**搞定。先上**:

class

solution

:def

singlenumber

(self, nums: list[

int])-

>

int:

return

reduce

(lambda x, y: x ^ y, nums)

作為乙個沒見過稍微複雜函式的python小白需要記下以下兩個函式的解釋:

reduce() 函式會對引數序列中元素進行累積。它的第乙個引數傳乙個函式,第二個引數傳乙個資料集合。通俗說,將該資料集合中的所有元素依次按照傳入函式的方法運算得到乙個最終結果。

lambda定義python中的匿名函式,相當於乙個極簡的函式,不用寫return也會預設返回計算的值。

所以以上的兩個函式,就將nums陣列中de的所有元素進行以下運算:

((nums[0]⊕nums[1])⊕nums[2]…)⊕nums[n]

最終這個結果也就是單獨的那個元素。**非常簡潔,贊?

每日一題 LeetCode

在陣列中的兩個數字,如果前面乙個數字大於後面的數字,則這兩個數字組成乙個逆序對。輸入乙個陣列,求出這個陣列中的逆序對的總數。示例 1 輸入 7,5,6,4 輸出 5 限制 0 陣列長度 50000 思想是 分治演算法 所有的 逆序對 於 3 個部分 左邊區間的逆序對 右邊區間的逆序對 橫跨兩個區間的...

LeetCode每日一題(題1028)

最近在刷leetcode每日一題,每次做完之後總能有些收穫,所以想著不如每天寫個部落格記錄一下做的題目的解法以及自己寫的時候問題出在 從先序遍歷還原二叉樹 題目大意 給出乙個字串 1 2 3 4 5 6 7 1代表節點的值,前面的 個數代表節點的深度。如果只有乙個子節點,保證這個節點為左子節點。返回...

LeetCode每日一題(題139)

題目 題目大意 給出乙個字串s和乙個字串陣列words,判斷s是否能夠拆分成多個words中的字串。分析 這道題比較簡單的方式應該是採用動態規劃來做。對於任意乙個字串中的區間,可以判斷該區間組成的字串是否在字典中,如果是,則這個區間的真假取決於前面那個區間的真假。給出狀態轉移方程dp i dp j ...