面試哈希映射關於代碼戰鬥的問題,需要幫助優化我的蠻力解決方案。這裏是問題:採訪準備:優化swapLexOrder
給定一個字符串str和對的數組,指示字符串中的哪些索引可以交換,返回允許的交換所產生的字典順序最大的字符串。您可以交換指數任意次數。
例
For str = "abdc" and pairs = [[1, 4], [3, 4]], the output should be
swapLexOrder(str, pairs) = "dbca".
通過交換給定的指標,你得到的字符串: 「CBDA」, 「cbad」, 「DBAC」, 「DBCA」。該列表中詞典上最大的字符串是「dbca」。
我目前的解決方案通過,直到沒有新的解決方案,不斷增加各種可能性
蠻力。 swapLexOrder('dznsxamwoj',[[1,2],[3,4],[6,5],[8,10]])
的速度太慢,在我的機器上沒有完成。任何提示優化?即通過一種更簡單的測試用例是swapLexOrder('abdc,[[1,4],[3,4]])= dbca
def swapLexOrder(str, pairs):
d = {}
d[str]=True
while True:
oldlen=len(d)
for x,y in pairs:
for s in d.keys():
d[swp(s,x,y)]=True
if len(d) == oldlen:
#no more new combinations.
return sorted(d)[-1]
def swp(str,x,y):
x=x-1
y=y-1
a=str[x]
b=str[y]
return str[0:x]+b+str[x+1:y]+a+str[y+1:]
哈哈,抱歉使用從問題中複製過來的「str」。我認爲這非常pythonic,不幸的是其中一個測試案例失敗。對於實際答案爲「zdxrabca」的'swap_lex_order(「acxrabdz」,[[1,3],[6,8],[3,8],[2,7]])= zdxrazcb'。該代碼以某種方式添加了一個額外的字母z,這裏有點晚,但我會盡量明天找到這個bug。我懷疑循環每個sub_perm是搞砸了某種類似於bug1。謝謝你的回答,學習了一些很酷的技巧 –
不知道該怎麼辦。它現在應該是固定的,雖然我沒有測試太多,下班後我會更多地考慮它 –