目标是取一个字符串并返回最常见的字母及其计数。对于字符串'hello'
,它将返回['l', 2]
。
我写了以下内容:
def most_common_letter(string)
list = []
bigcount = 0
while 0 < string.length
count = 0
for i in 0..string.length
if string[0] == string[i]
count += 1
end
end
if count > bigcount
bigcount = count
list = (string[0])
string.delete[string[0]]
end
end
return [list,bigcount]
end
我收到以下错误:
wrong number of arguments (0 for 1+)
(repl):14:in `delete'
(repl):14:in `most_common_letter'
(repl):5:in `initialize'
请帮助我理解我在delete
语句中做错了什么,或者是什么导致它返回错误。
我有另一种解决办法,但我认为这样做会很好。
答案 0 :(得分:3)
您正在使用delete
功能错误
使用string.delete(string[0])
代替string.delete[string[0]]
修改强>
至于你提到的无限循环。
你的条件是0 < string.length
并且您希望string.delete[string[0]]
语句实际上一次删除一个字符。
但究竟是什么呢,它会删除一个字符并返回新字符串,但它实际上从未改变/更改实际的字符串。
因此,请尝试将其更改为string = string.delete[string[0]]
答案 1 :(得分:1)
除了使用已经回答的delete()
代替delete[]
...
您需要的大部分内容都是在Ruby的String类中实现的。 each_char
和count
。
def most_common_letter(string)
max = [ nil, 0 ]
string.each_char {|char|
char_count = string.count(char)
max = [ char, char_count ] if char_count > max[1]
}
return max
end
答案 2 :(得分:0)
如果你允许我说,你可以用一种更容易的方式做到这一点。
def most_common_letter(string)
h = Hash.new
string.chars.sort.map { |c|
h[c] = 0 if (h[c].nil?)
h[c] = h[c] + 1
}
maxk = nil
maxv = -1
mk = h.keys
mk.each do |k|
if (h[k] > maxv) then
maxk = k
maxv = h[k]
end
end
[ maxk , maxv ]
end
如果您使用
进行测试puts most_common_letter("alcachofra")
结果将是
[ 'a', 3 ]
最后,请记住,在Ruby方法的最后,您不需要返回。分配的最后一个值将自动返回。
以Ruby方式执行Ruby!