Python面試不修改數(shù)組找出重復(fù)的數(shù)字
數(shù)組中重復(fù)的數(shù)字
在上一篇博客中劍指Offer之面試題3: 數(shù)組中重復(fù)的數(shù)字中,其實能發(fā)現(xiàn)這類題目的關(guān)鍵就是一邊遍歷數(shù)組一邊查滿足條件的元素。
然后我們在博客?用最復(fù)雜的方式學(xué)會數(shù)組(Python實現(xiàn)動態(tài)數(shù)組)?這篇博客中介紹了數(shù)組這一結(jié)構(gòu)的本質(zhì),并自己動手實現(xiàn)了一個動態(tài)數(shù)組。
今天我們介紹一下另一道來自《劍指Offer》的關(guān)于數(shù)組的面試題——不修改數(shù)組找出重復(fù)的數(shù)字。
不修改數(shù)組找出重復(fù)的數(shù)字
題目二:不修改數(shù)組找出重復(fù)的數(shù)字
給定一個長度為 n+1 的數(shù)組里的所有數(shù)字都在 0∼n 的范圍內(nèi),所以數(shù)組中至少有一個數(shù)字是重復(fù)的。
請找出數(shù)組中任意一個重復(fù)的數(shù)字,但不能修改輸入的數(shù)組。
樣例:
給定長度為8的數(shù)組 nums = [2, 3, 5, 4,3, 2, 6,7]
那么輸出重復(fù)的數(shù)字2或者3
思路
首先我們得關(guān)注到,題目要求是:不修改數(shù)組,然后還是 ?? 返回任意一個重復(fù)的數(shù)字?? 。所以解題思路相比而言變少了:
1.哈希表:跟上一題一樣,本題也可以創(chuàng)建一個哈希表,如果原數(shù)組的每個數(shù)字第一次出現(xiàn),就把他放到哈希表中去,即原數(shù)組大小為m的數(shù)字應(yīng)該放到哈希表下標(biāo)為m的位置上??臻g復(fù)雜度是 $O(n)$ 。
2.二分法:那么有沒有不用空間復(fù)雜度 $O(n)$ 的算法。假設(shè)沒有重復(fù)數(shù),那么??1~n?? 之間,每個數(shù)都只能出現(xiàn)一次。而題目中,這個數(shù)組至少有一個數(shù)字重復(fù),即出現(xiàn)的次數(shù)大于1。
利用二分的思想:把 ??1~n?? 的數(shù)字從中間數(shù)字 m 開始分為兩部分,前一半為 1~ m,后面一半為 ??m+1 ~n???,如果 ??1~m?? 中的數(shù)字在數(shù)組中出現(xiàn)的次數(shù)大于 m,那么這一半必定有重復(fù)的數(shù)字;
否則,那么另一部分必定含有重復(fù)數(shù)字。接著我們,繼續(xù)對含有重復(fù)數(shù)字的區(qū)間一分為二,直到找到重復(fù)的數(shù)字。
思路一:哈希表
def find_duplicated_num(nums): """hash_map""" hash_map = dict() for i, val in enumerate(nums): if val in hash_map: return val hash_map[val] = i return False
思路二:二分法
def reduce_inter(nums2, left, right): """ """ mid = (left + right) // 2 count = 0 length = len(nums2) for i in range(length): if (nums2[i] >= left) and (nums2[i] <= mid): count += 1 if count > mid - left + 1: return left, mid else: return mid+1, right def find_duplicated_num2(nums2): left, right = 1, len(nums2) - 1 while left != right: left, right = reduce_inter(nums2, left, right) return left
測試
nums = [2, 3, 5, 4, 3, 2, 6, 7] # nums_n = [5, 4, 3, 2, 6, 7] print("思路一測試結(jié)果: ", find_duplicated_num(nums)) print("思路二測試結(jié)果: ", find_duplicated_num2(nums))
結(jié)果
思路一測試結(jié)果: 3
思路二測試結(jié)果: 3
總結(jié)
其實,這種算法不能保證找出所有重復(fù)的數(shù)字,比如不能找出[2, 3, 5, 4, 3, 2, 6, 7]重復(fù)數(shù)字2。
以上就是不修改數(shù)組找出重復(fù)的數(shù)字Python實現(xiàn)的詳細(xì)內(nèi)容,更多關(guān)于python找出重復(fù)數(shù)字的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Python?Fire中兩種命令行參數(shù)靈活設(shè)置方式詳解
Python的Fire庫,一個用來生成命令行工具的的庫,這篇文章主要針對命令行參數(shù),補充兩種更加靈活的設(shè)置方式,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2024-01-01Python使用multiprocessing模塊實現(xiàn)多進(jìn)程并發(fā)處理大數(shù)據(jù)量的示例代碼
這篇文章主要介紹了Python使用multiprocessing模塊實現(xiàn)多進(jìn)程并發(fā)處理大數(shù)據(jù)量的示例代碼,本文通過示例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友參考下吧2024-01-01對Keras中predict()方法和predict_classes()方法的區(qū)別說明
這篇文章主要介紹了對Keras中predict()方法和predict_classes()方法的區(qū)別說明,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-06-06十個Python練手的實戰(zhàn)項目,學(xué)會這些Python就基本沒問題了(推薦)
這篇文章主要介紹了Python實戰(zhàn)項目,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-04-04PyCharm搭建Spark開發(fā)環(huán)境的實現(xiàn)步驟
這篇文章主要介紹了PyCharm搭建Spark開發(fā)環(huán)境的實現(xiàn)步驟,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-09-09Python 操作mysql數(shù)據(jù)庫查詢之fetchone(), fetchmany(), fetchall()用法示例
這篇文章主要介紹了Python 操作mysql數(shù)據(jù)庫查詢之fetchone(), fetchmany(), fetchall()用法,結(jié)合實例形式分析了Python使用pymysql模塊的fetchone(), fetchmany(), fetchall()方法進(jìn)行mysql數(shù)據(jù)庫查詢的操作技巧,需要的朋友可以參考下2019-10-10