最近在複習算法和數據結構(基於Python實現),而後看了Python的各類「序列」——好比列表List、元組Tuple和字符串String,後期會寫一篇博客介紹 數組
這一數據結構。python
不過咱們先來看《劍指Offer》中關於數組的一道面試題。面試
題目一:找出數組中重複的數字算法
給定一個長度爲 n 的數組裏的全部數字都在 0∼n−1 的範圍內。shell
數組中某些數字是重複的,但不知道有幾個數字重複了,也不知道每一個數字重複了幾回。數組
請找出數組中任意一個重複的數字。數據結構
樣例:測試
給定 nums = [2, 3, 1, 0, 2, 5, 3]code
返回 2 或 3排序
首先咱們得明白,題目要求是 返回任意一個重複的數字
。並無限定其餘條件(時間複雜度和空間複雜度多少),因此解題思路有不少,咱們着重看下面這幾中解法:字符串
如下代碼都是用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 -- 兩數之和解法思路很像,都是對數組中知識的考察。有興趣的同窗能夠去作作那道題,代碼實現上也很一致。