AirBNB有一個面試題:
您有一個已排序的陣列,并且希望通過 python 中的函式獲取元素匹配出現的第一個索引和最后一個索引。如果沒有匹配項,則回傳 [-1.-1]。如果匹配,則回傳 [first_index,last_index]。
這是我的新手解決方案,誰能想出更好的解決方案?
順便說一下,這個問題來自 TechLead DailyInterviewPro。
def solution(array,key):
start_index = -1
ending_index = -1
if key not in array:
return [start_index,ending_index]
else:
for i in range(len(array)):
if array[i]==key:
if start_index == -1:
start_index = i
ending_index = i
else:
ending_index = i
return [start_index,ending_index]
uj5u.com熱心網友回復:
帶一個內膽,使用list.index您可以使用的功能
[-1, -1] if key not in array else [arrary.index(key),len(array)-array[::-1].index(key)-1 ]
很少有效率的代碼,如果記憶體不是問題,否則需要使用兩個指標方法
def solution(array, key):
store_index = {}
for index, value in enumarate(array):
if value not in store_index:
store_index[value] = []
store_index[value].append(index)
if key not in store_index:
return [-1, -1]
return [store_index[key][0], store_index[key][-1]]
uj5u.com熱心網友回復:
只是為了好玩,一個優化的解決方案:
- 用于
index將確認至少一個值存在并檢索其索引的作業推送到C層 - 避免掃描超出需要的單個元素,并且不制作任何副本(它根本不訪問
start_index和之間的元素end_index):
def solution(array,key):
try:
return [array.index(key),
len(array) - next(i for i, x in enumerate(reversed(array), 1) if x == key)]
except ValueError:
return [-1, -1]
它依賴于array.index計算第一個元素的索引或提高ValueError(在這種情況下不存在這樣的元素),然后通過從運行list在相反順序上的geneexpr 檢索單個值來獲取索引(geneexpr 保證找到一些東西) ,最壞的情況是它會一直運行,直到找到與index呼叫找到的元素相同的元素)。從技術上講,這確實意味著如果元素只出現一次,我們測驗它兩次是否相等(來自任一端),但避免所說的“成本”,雖然可能通過itertools.islice,這幾乎不值得打擾。
如果你真的喜歡單線,你總是可以這樣做:
def solution(array,key):
return [next((i for i, x in enumerate(array) if x == key), -1)
next((len(array) - i for i, x in enumerate(reversed(array), 1) if x == key), -1)]
盡管該解決方案確實涉及在array未找到元素時掃描整個兩次(一次向前,一次向后)(如果元素存在,則掃描最少數量的元素)。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/395614.html
上一篇:如何同時映射3個或更多陣列
下一篇:Scala中的初始陣列元素?
