目前,我正在编写一个程序,用于计算用户提交的字符串中的所有非空白字符,然后返回最常用的字符。我不能使用集合,计数器或字典。这就是我想要做的事情:
拆分字符串以删除空格。然后计算每个字符并返回一个值。我想在这里发布一些内容,但到目前为止我所尝试的一切都遇到了严重的失败。我最接近的是这个节目:
nightmarejs
如果您可以修复此代码或告诉我更好的方法,以满足所需的标准,这将有所帮助。并且,在你说这个论坛已经在这个论坛上做了一百次之前,请注意我创建了一个专门用来提出这个问题的帐户。是的,有很多这样的问题,但有些问题是从文本文件或程序中的现有字符串中读取。其中绝大多数包含字典,计数器或集合,我在本章中目前无法使用。
答案 0 :(得分:2)
就这样做“旧方式”。创建一个列表(好吧它是一个集合,但是一个非常基本的集合,所以不应该是一个问题)26个零并根据位置增加。同时计算最大索引。
strin="lazy cat dog whatever"
l=[0]*26
maxindex=-1
maxvalue=0
for c in strin.lower():
pos = ord(c)-ord('a')
if 0<=pos<=25:
l[pos]+=1
if l[pos]>maxvalue:
maxindex=pos
maxvalue = l[pos]
print("max count {} for letter {}".format(maxvalue,chr(maxindex+ord('a'))))
结果:
max count 3 for letter a
答案 1 :(得分:0)
作为Jean解决方案的替代方案(不使用允许对字符串进行一次传递的列表),您可以在这里使用str.count
,这几乎可以解决您尝试过的问题要做:
strin = input("Enter a string: ").strip()
maxcount = float('-inf')
maxchar = ''
for char in strin:
c = strin.count(char) if not char.isspace() else 0
if c > maxcount:
maxcount = c
maxchar = char
print("Char {}, Count {}".format(maxchar, maxcount))
如果有可用的列表,我会使用Jean的解决方案。他没有使用O(N)
函数N
次: - )
P.s:如果你使用max
:
max(((strin.count(i), i) for i in strin if not i.isspace()))
答案 2 :(得分:0)
要跟踪不同字符的多个计数,您必须使用集合(即使它是在Python中作为字典实现的全局命名空间)。
在支持任意Unicode字符串的同时打印最常用的非空格字符:
import sys
text = input("Enter a string (case is ignored)").casefold() # default caseless matching
# count non-space character frequencies
counter = [0] * (sys.maxunicode + 1)
for nonspace in map(ord, ''.join(text.split())):
counter[nonspace] += 1
# find the most common character
print(chr(max(range(len(counter)), key=counter.__getitem__)))
Cython中的类似列表是the fastest way to find frequency of each character。