一塊兒來刷《劍指Offer》-- 題目一:找出數組中重複的數字(Python多種方法實現)

數組中重複的數字

最近在複習算法和數據結構(基於Python實現),而後看了Python的各類「序列」——好比列表List、元組Tuple和字符串String,後期會寫一篇博客介紹 數組 這一數據結構。python

不過咱們先來看《劍指Offer》中關於數組的一道面試題。面試

面試題3:數組中重複的數字

題目一:找出數組中重複的數字算法

給定一個長度爲 n 的數組裏的全部數字都在 0∼n−1 的範圍內。shell

數組中某些數字是重複的,但不知道有幾個數字重複了,也不知道每一個數字重複了幾回。數組

請找出數組中任意一個重複的數字。數據結構

樣例:測試

給定 nums = [2, 3, 1, 0, 2, 5, 3]code

返回 2 或 3排序

思路

首先咱們得明白,題目要求是 返回任意一個重複的數字 。並無限定其餘條件(時間複雜度和空間複雜度多少),因此解題思路有不少,咱們着重看下面這幾中解法:字符串

  1. 排序後查找:簡單的方法就是先把輸入的數組排序,排好序的數組,直接比較相鄰的兩個數就好,若是存在相鄰的數組相等,返回這個數。
  2. 利用哈希表:從頭至尾按順序掃描數組的每一個數字,每掃到一個數字的時候,若是尚未這個數字,就把它加入哈希表。若是哈希表表中已經存在了該數字,就找到了一個重複的數字。
  3. 時間換空間:咱們觀察到,利用哈希表的方法是增長了 $ o(n)$ 大小的哈希表爲代價,看能不能找到$ o(1) $的算法。

如下代碼都是用Python實現

排序後查找

def find_double_num(nums):
    """思路一:把輸入的數組排序,從排序數組中找出重複的數字
    """
    nums_sorted = sorted(nums)
    length = len(nums_sorted)
    for i in range(1, length):
        if nums_sorted[i] == nums_sorted[i - 1]:
            print("重複數字: ", nums_sorted[i])
            return True
    return False

利用哈希表

def find_double_num2(nums):
    """思路二:哈希表,從頭至尾順序掃描數組中的每一個數字,
    哈希表中沒有這個數字就加入哈希表。若是哈希表中存在就找到了一個重複的數字"""
    hash_map = dict()
    for i, val in enumerate(nums):
        if val in hash_map:
            print("重複數字: ", val)
            return True
        hash_map[val] = i
    return False

時間換空間的方法

def find_double_num3(nums):
    if nums is None and len(nums) <= 0:
        return False
    for i in range(len(nums)):
        while i != nums[i]:
            if nums[i] == nums[nums[i]]:
                print("重複數字: ", nums[i])
                return True
            else:
                tmp = nums[i]
                nums[i] = nums[tmp]
                nums[tmp] = tmp
    return False

測試

nums_test = [2, 3, 1, 0, 2, 5, 3]
print(find_double_num(nums_test))
print(find_double_num2(nums_test))
print(find_double_num3(nums_test))

輸出結果

重複數字:  2
True
重複數字:  2
True
重複數字:  2
True

總結

其實,剛看到書的這道題,我就以爲很眼熟。仔細想一想,這道題跟LeetCode 01 -- 兩數之和解法思路很像,都是對數組中知識的考察。有興趣的同窗能夠去作作那道題,代碼實現上也很一致。

相關文章
相關標籤/搜索