您好,登錄后才能下訂單哦!
這篇文章主要為大家展示了“LeetCode如何找出只出現一次的數字”,內容簡而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領大家一起研究并學習一下“LeetCode如何找出只出現一次的數字”這篇文章吧。
1
題目描述
給定一個非空整數數組,只有一個數字出現一次,其余出現三次,找出只出現一次的數字。如輸入[3,4,5,4,3,3],輸出5。
2
解題
對集合進行切片,生成三個集合,找到與另外兩個集合不同的集合缺少的數字。如集合[2,2,3,2],先對集合進行排序,得到[2,2,2,3],通過切片生成集合[2,3]、[2]、[2],比較集合之間元素差別,得到輸出結果3。
class Solution: def singleNumber(self, nums: List[int]) -> int: nums.sort() a=len(set(nums[::2])) b=len(set(nums[1::2])) if a==b: return list(set(nums[::3]) - set(nums[2::3]))[0] else: return list(set(nums[::3]) - set(nums[1::3]))[0]
通過set方法時空復雜度都是O(N),位運算可以使得空間復雜度降為O(1)。在LeetCode刷題DAY 5:只出現一次的數字中使用的“異或”其實就是同一狀態出現兩次則歸零,即0->1->10=0的變化,在本題中則是要讓同一狀態出現三次歸零,即00->01->10->11=00,可見這里需要用兩個bit進行狀態記錄。
這里需要注意的是,要對two、one兩位分別計算。對于one,當two=1時,不管輸入是什么下一步的one都為0,當two=0時,輸入1則one=~one,輸入0則one不變。對于two,依賴于one變化后的狀態,one新狀態為1時,two則為0,one新狀態為0時,輸入1則two=~two,輸入0則不變。因為出現三次就歸零,所以one最后保留的是只出現了一次的值。
class Solution: def singleNumber(self, nums: List[int]) -> int: one,two = 0,0 for i in nums: one = one^i & ~two two = two^i & ~one return one
以上是“LeetCode如何找出只出現一次的數字”這篇文章的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注億速云行業資訊頻道!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。