1. 程式人生 > >python面試題,求兩個List各個元素相減絕對值最小是多少

python面試題,求兩個List各個元素相減絕對值最小是多少


春暖花開,人心浮動,吾思當左遷之,一則工資上漲,二則環境變好。奈何世道不然,吹牛空談者大受歡迎,而吾實事求是者則落寞如此,知之為知之,不知為不知。

投遞無數,才得一二,某國有電信公司邀請面試,始記得吾曾於去年三月去過,現復一年又至三月,碰運氣吧!

約至午後兩點,前臺等候,看人群左左右右的通過,心煩意亂,約莫兩刻過去了,方使有人慢悠悠的過來,詢問情況。領至一室,面窗而座,春日陽光甚毒,心煩更甚,看面前之人實是公司無要職之人,來應付我罷了。

一白紙,一枝筆,寫一演算法,求兩組各值相減的絕對最小值 。怒已,吾實乃無急智之人,左右思之,不得頭緒,只得推說不會。來人講:

你就不會寫個雙重迴圈嗎?


今得空閒,思之,將我的演算法公之於眾。

雙重迴圈確實是最簡單的,但大家都知道雙重迴圈是最耗時間和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秒