[英]Finding the unique string within an list of strings
def find_uniq(arr):
diff = None
first = None
for s in arr:
if first is None:
first = s
continue
if (len(first) in [0, 1]) and (len(s) in [0, 1]):
if arr.count(first) == 1:
return first
elif arr.count(s) == 1:
return s
temp = set(first.lower()).difference(set(s.lower()))
if temp:
diff = s
if diff is not None:
temp = set(diff.lower()).difference(set(s.lower()))
return first if temp else diff
我的代碼通過了他們所有的單元測試,但問題是當我使用以下自定義單元測試嘗試它時,它失敗了
test.assert_equals(['foo', 'abc', 'acb', 'bac', 'bca', 'cab', 'cba dab'], 'foo') # fails, returns 'abc'
練習如下:
有一個字符串數組/列表。 除了一個之外,所有字符串都包含相似的字母。 試着找到它!
和規則是:
字符串可能包含空格。 空格不重要,只有非空格符號很重要。 例如,只包含空格的字符串就像空字符串。
保證數組/列表包含超過 3 個字符串。
關於如何改進以處理此類情況的任何建議,甚至只是對 function 整體的總體改進。
謝謝你。
循環調用list.count
方法效率低下。 您可以改為使用 dict 來跟蹤到目前為止您已迭代的唯一字符集。 將字符集減去空格作為字典的鍵,將字符串本身作為值。 如果當前鍵已經在字典中,那么您就會知道該鍵不是唯一的。 然后任務變成找到與該公共密鑰不同的密鑰。 如果字典中已經有不同的鍵,則返回該不同鍵的值。 如果沒有,請繼續迭代,直到獲得與已知公共密鑰不同的密鑰:
def find_uniq(arr):
seen = {}
common = None
for string in arr:
key = frozenset(set(string.lower()).difference(' '))
if key in seen:
common = key
if common is not None:
if key != common:
return string
if len(seen) > 1:
del seen[common]
return next(iter(seen.values()))
seen[key] = string
以便以下表達式都為True
:
find_uniq(['foo', 'abc', 'acb ']) == 'foo'
find_uniq(['abbc', 'foo', 'acb ']) == 'foo'
find_uniq(['abc', 'acb ', 'foo']) == 'foo'
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.