我正在尝试取一个数字并返回一个带有任何奇数的破折号的字符串。此外,字符串不应以短划线开头或结尾。
我写了以下内容,但它没有返回任何内容:
def dasherize_number(num)
string = num.to_s
i = 0
while i<string.length
if (string[i].to_i % 2) != 0
string[i] = '-' + string[i] + '-'
end
i += 1
end
if string[0] == '-'
string.pop(1)
end
if (string.length - 1) == '-'
string.pop(1)
end
string
end
如果我理解正确,它似乎无限循环;控制台没有显示输出,除非我刷新,否则不允许我做任何其他事情。我已经按每个角色审查了代码,但我无法确定它出错的地方。
答案 0 :(得分:1)
您的代码中存在许多逻辑问题。 这里可能适合你的东西
def dasherize_number(num)
string = num.to_s
str_len = string.length
i = 0
while i < str_len
next if string[i] == '-'
if (string[i].to_i % 2) != 0
string[i] = '-' + string[i] + '-'
str_len = string.length
i += 3
else
i += 1
end
end
if string[0] == '-'
string = string[1..-1]
end
if (string[string.length - 1]) == '-'
string = string[0..-2]
end
string.gsub('--', '-')
end
<强>释强>
首先,你在while循环i < string.length
中遇到了这种情况
哪个不起作用,因为字符串的长度不断变化。所以我已经使用变量来存储值,并在字符串更新时更新变量。
如果字符串已更新,我们可以确定我们可以跳过下两个索引。
例如:数字输入 - &gt; 122
然后在第一次迭代后,字符串将是-1-22
所以我们不想为下一个索引运行相同的条件,因为那将是1
,因此是无限循环。 (希望你明白这一点)
pop
不会在字符串上工作,只是因为我们可以使用像数组这样的索引访问字符,我们无法使用pop
作为字符串。
为确保没有连续短划线,我已使用gsub
将其替换为单个破折号。
答案 1 :(得分:0)
问题似乎出现在代码的这一部分:
while i<string.length
if (string[i].to_i % 2) != 0
string[i] = '-' + string[i] + '-'
end
i += 1
end
如果您的string
包含奇数,则会将其长度增加2个字符(2x -
),但会将其增加1(i+=1
)。
将初始字符串长度分配给var并在while
循环中检查其长度。
string_length = string.length
while i < string_length
if ((string[i].to_i % 2) != 0)
string[i] = '-' + string[i] + '-'
end
i += 1
end