我是一名在Codewars上接受训练的新手,但我无法找到以下RLE问题中的错误所在,请看以下说明:
你的任务是编写这样一个运行长度编码。 对于给定的字符串,返回一对数组 [ (i1, s1), (i2, s2), …, (in, sn) ],使得可以通过复制sx ix次字符并连接所有这些字符串来重构原始字符串。您的运行长度编码应该是最小的,即对于所有的 i,值 si和si+1应该不同。
示例
我收到了这个错误信息:
你的任务是编写这样一个运行长度编码。 对于给定的字符串,返回一对数组 [ (i1, s1), (i2, s2), …, (in, sn) ],使得可以通过复制sx ix次字符并连接所有这些字符串来重构原始字符串。您的运行长度编码应该是最小的,即对于所有的 i,值 si和si+1应该不同。
示例
>rle("hello world!")
# => [[1,'h'],[1,'e'],[2,'l'],[1,'o'],[1,' '],[1,'w'],[1,'o'],[1,'r'],[1,'l'],[1,'d'],[1,'!']]
>rle("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbb")
# => [[34,'a'], [3,'b']]
这是我的代码:
def rle(str)
result=[[]]
str.to_s.split.each do |word| #"Hello World"->["Hello","World!"]-->"Hello", "World!"
new_word_count=[[]]
word.each_char do |char| #"H","e","l"...
new_char=true
new_word_count.map! do |find|
if find[1]==char
find[0]+=1
new_char=false
break
end
end
if new_char==true
new_word_count<<[1,'char']
end
end
result+=new_word_count
end
result
end
我收到了这个错误信息:
`block (3 levels) in rle': undefined method `[]' for nil:NilClass (NoMethodError)
from `map!'
from `block (2 levels) in rle'
from `each_char'
from `block in rle'
from `each'
from `rle'
from `
'
运行长度编码(RLE)是一种非常简单的数据压缩形式,其中数据的连续序列(即,相同的数据值在许多连续的数据元素中出现的序列)被存储为单个数据值和计数,而不是原始的连续序列。维基百科
map!
?map
的目的是将数组的每个元素转换为另一个具有相同元素数量的数组,这些元素由提供给map
的块确定。而map!
则直接替换原始数组中的每个元素。 - lurkermap!
。谢谢您的快速回答 :) - Guillermo García Serranomap
块中间使用了break
,这是一个很好的迹象,说明你没有正确使用它。看起来更像是你试图使用它来循环遍历数组元素以修改不同的变量,这应该使用类似于each
的东西来完成。 - lurker