[Leetcode]Single Number

Given an array of integers, every element appears twice except for one. Find that single one.

Note:
Your algorithm should have a linear runtime complexity. > Could you implement it without using extra memory?
整數型數組中,每個元素均出現兩次,除了一個元素例外,如何找出這個元素?能否設計一個線性時間的算法,且不需要額外的存儲空間?

解題思路

(1)O(n^2)的解法

  • 對元素的出現次數進行統計,可進行n*n循環,判斷元素是否只出現了一次。這樣時間複雜度爲O(n^2), 不需要額外空間

  • 先對元素進行排序,然後進行相鄰兩元素的對比,如a1和a2對比,a3和a4對比,如果不同,則前一個元素(a1、a3)就是所要查找的元素。
    給出第二種想法的代碼

class Solution:
    # @param A, a list of integer
    # @return an integer
    def singleNumber(self, A):
        A.sort()
        for i in range(1, len(A), 2):
            if A[i] != A[i-1]: # 與前一元素對比
                return A[i-1]
        return A[-1] # 要找的元素是最後一個元素

實現上主要就是相鄰兩元素的對比,循環間隔爲2,與前一元素對比,如果不同,則返回前一元素。
如果循環執行完沒有返回,則返回列表中最後一個元素,如[1, 1, 2, 2, 3],執行的循環爲(1, 3),在循環中最後一個元素不會參與對比(奇數個元素)

(2)O(n)的解法

發現了一個很有意思的解決方式:利用XOR運算,就是異或
因爲A XOR A = 0,且XOR運算是可交換的,於是,對於實例{2,1,4,5,2,4,1}就會有這樣的結果:

(2^1^4^5^2^4^1) => ((2^2)^(1^1)^(4^4)^(5)) => (0^0^0^5) => 5

就把只出現了一次的元素(其餘元素均出現兩次)給找出來了!

算法複雜度爲O(n),且不需要額外空間,代碼如下:

class Solution(object):
    def singleNumber(self, nums):
        """
        :type nums: List[int]
        :rtype: int
        """
        result = 0
        for i in nums:
            result^=i
        return(result)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章