用Python查找數組中出現奇數次的那個數字


有一個數組,其中的數都是以偶數次的形式出現,只有一個數出現的次數為奇數次,要求找出這個出現次數為奇數次的數。

集合+統計

解題思路

最簡單能想到的,效率不高。利用集合的特性,通過 Python 的 set() 函數篩選出數組中有哪些數,然后遍歷集合,使用 List 的 count 方法統計集合中每個元素在數組中出現的次數,如果是奇數次則直接返回該數。

Python 實現

def find_odd_times_num(arr):
    num = set(arr)
    for i in num:
        if arr.count(i) % 2 != 0:
            return i

排序+遍歷

解題思路

將數組從小到大排序,然后遍歷數組,並對出現的數進行計數b,當出現不同的數時,判斷上一個數出現次數是奇數還是偶數。

Python 實現

def find_odd_times_num(arr):
    arr.sort()
    cnt = 1
    for i in range(1, len(arr)):
        if arr[i] != arr[i - 1]:
            if cnt % 2 != 0:
                return arr[i-1]
            else:
                cnt = 1
        else:
            cnt += 1
    if cnt % 2 != 0:
        return arr[i]

改進版本:

借用計數排序的思想,先找到數組中最大的元素,然后開辟一個新數組,原數組中每個元素的值即為新數組的下標,遍歷原數組記錄每個元素出現的次數,最后遍歷新數組,找到奇數,返回其下標。

def find_odd_times_num(arr):
    m = max(arr)
    cnt = [0] * m
    for i in arr:
        cnt[i-1] += 1
    for j in range(m):
        if cnt[j] % 2 != 0:
            return j+1

Map + 統計

解題思路

遍歷數組記錄出現次數先計數,並存儲到 Map 中,再遍歷 Map,找出 Map 中 value 為奇數的 key。

Python 實現

def find_odd_times_num(arr):
    dict = {}
    for i in arr:
        if i in dict:
            dict[i] += 1
        else:
            dict[i] = 1
    for k, v in dict.items():
        if v % 2 != 0:
            return k

位運算

解題思路

巧妙地采用異或的特點進行處理,即整數 n 與 0 的異或結果為 n,整數 n 與 n 的異或結果為 0,異或運算滿足交換律和結合律。即,所有出現偶數次的數異或的結果為 0,而對於出現次數為奇數次n的數,其出現的前 n-1 次異或的結果為 0,而 0 與其最后1次出現進行異或,得到該數本身。因此,可以很方便找出出現次數為奇數次的數。

Python 實現

def find_odd_times_num(arr):
    res = 0
    for i in arr:
        res ^= i
    return res


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM