python面試題,求兩個List各個元素相減絕對值最小是多少
阿新 • • 發佈:2019-02-16
春暖花開,人心浮動,吾思當左遷之,一則工資上漲,二則環境變好。奈何世道不然,吹牛空談者大受歡迎,而吾實事求是者則落寞如此,知之為知之,不知為不知。
投遞無數,才得一二,某國有電信公司邀請面試,始記得吾曾於去年三月去過,現復一年又至三月,碰運氣吧!
約至午後兩點,前臺等候,看人群左左右右的通過,心煩意亂,約莫兩刻過去了,方使有人慢悠悠的過來,詢問情況。領至一室,面窗而座,春日陽光甚毒,心煩更甚,看面前之人實是公司無要職之人,來應付我罷了。
一白紙,一枝筆,寫一演算法,求兩組各值相減的絕對最小值 。怒已,吾實乃無急智之人,左右思之,不得頭緒,只得推說不會。來人講:
你就不會寫個雙重迴圈嗎?
今得空閒,思之,將我的演算法公之於眾。
雙重迴圈確實是最簡單的,但大家都知道雙重迴圈是最耗時間和CPU的,10*10、100*100、1000*1000都沒有什麼問題,但當你10000*10000時問題就來了,1億次的迴圈,夠嗆的了。
現在把雙重迴圈和我的演算法貼出來,請同學們過目,指出可以改進的地方
算下來,當10000*10000時,雙重迴圈用時大概N0秒左右 ,看你的計算機效能了。而我寫的是做了20000次的迴圈,大概1秒多點,跟1億次時間上差距很大。
#utf-coding:utf-8 import random import datetime #隨機兩個包含1萬個元素的list list1,list2 = [],[] for x in range(10000): a = random.randint(-99999999999,99999999999) if a not in list1: list1.append(a) for x in range(10000): a = random.randint(-99999999999,99999999999) if a not in list2 and a not in list1: list2.append(a) #列印開始時間,這是第一種方法,採用傳統的雙迴圈的處理方法,10000^2就是一個億啊 print "第一種方法\n",str(datetime.datetime.now()) min = float("inf") #設定min為無限大 for i in list1: #雙迴圈開始 for j in list2: # print abs(i-j) if abs(i-j) < min: min = abs(i-j) print min,"\n",str(datetime.datetime.now()),"\n" #列印結束時間 #列印開始時間。第二種方法,我的方法,基本思路是雙迴圈變單迴圈,兩個10000就是20000 #使用python內建函式 ,無論在什麼時候,python的內建函式絕對比你的方法快 print "第二種方法\n", str(datetime.datetime.now()) min = float("inf") #兩個list合併,去重,看看長度是否減小,如果有減小,就證明了一件事,兩個list中有元素相同,這兩個元素相減絕對等於0 list3 = list(set(list1+list2)) if len(list3) != len(list1+list2): min = 0 else: #將合併後的list排序 list3.sort() for i in range(len(list3)-1): #已經排序了,我們只需要讓後一個減前一個,然後再保證這兩個資料原來不是在相同的list中即可 if abs(list3[i+1]-list3[i]) <min and \ (list3[i+1] in list1 or list3[i] in list1 )\ and (list3[i+1] in list2 or list3[i] in list2): min = abs(list3[i+1]-list3[i]) print min,"\n",str(datetime.datetime.now()),"\n"
主要是and條件不好解決,我查了些資料,沒有發現python的xor,不知道到底有沒有
後記,Intel的U系列CPU果然效能差,隨機值的大小也能影響到速度。借同學的至強E5伺服器,15秒雙迴圈就完成了。而我寫的不到0.1秒