题目
思路
- 不需要提前用lower方法来全部小写化,在大数据量时比较慢,直接遍历一次分别判断统计就行。统计count存在长度为26的list中,下标表示偏移量,最后遍历count list来求最高频的字母
- 其实像具体字符的ASCII固定的order(),len()固定的可以硬编码写死,效率高很多,不用每次循环都去调,但是编码规范,可读性这些又太差了
我的代码
def checkio(text):
count_list = [0 for i in range(26)]
for letter in text:
if 'a' <= letter <= 'z':
count_list[ord(letter) - ord('a')] += 1
elif 'A' <= letter <= 'Z':
count_list[ord(letter) - ord('A')] += 1
max_index = 0
index = 0
max_value = 0
while index < len(count_list):
if count_list[index] > max_value:
max_index = index
max_value = count_list[index]
index += 1
#没有字母的字符串
if max_value == 0:
return ''
else:
return chr(ord('a') + max_index)
if __name__ == '__main__':
#These "asserts" using only for self-checking and not necessary for auto-testing
assert checkio("Hello World!") == "l", "Hello test"
assert checkio("How do you do?") == "o", "O is most wanted"
assert checkio("One") == "e", "All letter only once."
assert checkio("Oops!") == "o", "Don't forget about lower case."
assert checkio("AAaooo!!!!") == "a", "Only letters."
assert checkio("abe") == "a", "The First."
print("Start the long test")
assert checkio("a" * 9000 + "b" * 1000) == "a", "Long."
print("The local tests are done.")
clear code
import string
def checkio(text):
"""
We iterate through latyn alphabet and count each letter in the text.
Then 'max' selects the most frequent letter.
For the case when we have several equal letter,
'max' selects the first from they.
"""
text = text.lower()
return max(string.ascii_lowercase, key=text.count)
creative code
def checkio(text):
r = {c: text.lower().count(chr(c)) for c in range(97, 123)}
return chr(max(r, key=r.__getitem__ ))
自己写的感觉还是在用C的思路写,python自带的API,轮子这些还是不熟悉