閑來無事,突然看到博客園首頁上有人寫了篇了華為2018軟件崗筆試題解題思路和源代碼分享。看了下題目,感覺第一題能做出來,就想着用剛剛學的python試着寫一下,花費的時間有點長~~,看來又好長時間沒練習算法了。
題目描述
輸入兩個字母串,將兩個字母串都包含的字母用'_'替換后,輸出兩個字母串的剩余部分。
輸入描述:
輸入兩個字符串,字符串最大長度為100。字符串只包含字母,不可能為空串,區分大小寫。
輸出描述:
按字符串順序輸出處理后的字符串
示例1
輸入
abcd
bdef
輸出
a_c_
__ef
解題思路:對輸入的兩個字符串分別建立ASCII中a-z和A-Z字符順序的hash表,hash表默認為0,遍歷一次字符串,每出現一個字符對應的hash表加1,可以得到包含字符出現次數的hash表。之后,對字符串中的每一個字符根據兩個hash表判斷是否在兩個字符串都包含,如果是用'_'替換。最后輸出字符串。
python關鍵點:因為str
類型是不可變類型,所以我想到了先用list()
函數把字符串轉換成列表,之后替換就變得容易了。
代碼展示
def replaceSame(str1, str2):
list1 = list(str1)
list2 = list(str2)
hashTable1 = {}
hashTable2 = {}
for i in range(65, 91):
hashTable1[i] = 0
hashTable2[i] = 0
for i in range(97, 123):
hashTable1[i] = 0
hashTable2[i] = 0
for i in list1:
hashTable1[ord(i)] += 1
for i in list2:
hashTable2[ord(i)] += 1
for i in list1 if len(list1)>=len(list2) else list2:
if hashTable1[ord(i)]>0 and hashTable2[ord(i)]>0:
list1[list1.index(i)] = '_'
list2[list2.index(i)] = '_'
print("".join(list1))
print("".join(list2))
def judge(str1, str2):
if len(str1)>10 or len(str2)>10:
print('請輸入長度不超過100的字符串')
return False
elif str1=="" or str2=="":
print('字符串不能為空')
return False
for j in a:
if 65<=ord(j)<=90 or 97<=ord(j)<=122:
continue
else:
print('請輸入只包含字母的字符串')
return False
return True
if __name__ == '__main__':
a = input("a=")
b = input("b=")
if judge(a, b):
replaceSame(a, b)
結果展示
額,代碼貌似有點長了,路過的童鞋要是有什么更簡單高效的方法可以在評論中點出來的呦~~,本女子不勝感激。