2017-10-15 99 views
0

我正在練習裂解編碼面試的問題以變得更好,以防萬一,以備隨時使用。第一個問題是:查找一個字符串是否包含所有唯一字符?我寫這和它完美的作品:檢查一個字符串是否都是唯一的字符,空格除外

def isunique(string): 
    x = [] 
    for i in string: 
     if i in x: 
      return False 
     else: 
      x.append(i) 
    return True 

現在,我的問題是,如果我有所有的獨特字符,如在: 「我是J」 這將是非常罕見的,但可以說這只是偶然發生,我怎麼能爲這些空格創建一個例外?我認爲它不會將空間算作角色,所以func返回True而不是False?

+1

使用'isspace()' – mentalita

+2

我建議只是在將'string.replace(「」,「」)傳遞給你已經在使用的'isunique'函數中運行... – Shadow

+0

@mentalita how你會完全融入isspace()嗎?如果我在for循環中這樣做,它會使字符串成爲布爾值而不是可迭代的 – MAUCA

回答

1

現在不管多麼空間或有多少特殊字符在您的字符串,它只會算的話:

import re 
def isunique(string): 
    pattern=r'\w' 
    search=re.findall(pattern,string) 
    string=search 
    x = [] 
    for i in string: 
     if i in x: 
      return False 
     else: 
      x.append(i) 
    return True 



print(isunique('I am J')) 

輸出:

True 

沒有空間詞語測試用例:

print(isunique('war')) 
True 

與空間的話測試用例:

print(isunique('w a r')) 
True 

重複的字母:

print(isunique('warrior')) 
False 
0

選項1
優雅的方法,將具有collections.Counter

from collections import Counter 

def isunique(string): 
    return Counter(string.replace(' ', '')).most_common(1)[0][-1] == 1 

選項2 稍微更有效,但不太漂亮。

def isunique(string): 
    c = Counter() 
    for s in string.replace(' ', ''): 
     c[s] += 1 
     if c[s] > 1: 
      return False 
    return True 
In [141]: isunique('I am JJ') 
Out[141]: False 

In [142]: isunique('I am J') 
Out[142]: True

該解決方案將不會在整個列表循環,如果有可能檢測到重複的越快。


如果你的字符串包含的不僅僅是更多的空格(製表符和例如換行),我建議基於正則表達式替換:

import re 
string = re.sub(r'\s+', '', string, flags=re.M) 
0

創建人物的名單,你要考慮爲非字符並將其替換爲字符串。然後執行你的功能代碼。

作爲替代,以檢查字符的獨特性,更好的辦法將是最終的字符串的長度的set值進行比較,該字符串爲:

def isunique(my_string): 
    nonchars = [' ', '.', ','] 
    for nonchar in nonchars: 
     my_string = my_string.replace(nonchar, '') 
    return len(set(my_string)) == len(my_string) 

樣品試驗:

>>> isunique('I am J') 
True 

按了Python的set() document

返回一個新的集合對象,可選地使用從迭代中提取的元素。 集是一個內置的類。有關該課程的文檔,請參見set和Set Types - set,frozenset 。

-1

簡單的解決方案

def isunique(string): 
    return all(string.count(i)==1 for i in string if i!=' ') 
+1

簡單就是最好!這個函數具有二次複雜性,而且非常慢。 –

0

而且......答案池是永遠不會完成,除非也有一個正則表達式的解決方案:

def is_unique(string): 
    import re 
    patt = re.compile(r"^.*?(.).*?(\1).*$") 
    return not re.search(patt, string) 

(我會留下空白處理作爲練習到OP)

相關問題