我在做一个在线课程:
写一个方法,它接受一个字符串,如果字母"z"
出现在"a"
后面的三个字母之内,则返回true
。您可以假定字符串只包含小写字母。
这是给定的解决方案:
def nearby_az(string)
i = 0
while i < string.length
if string[i] != "a"
i += 1
next
end
j = i + 1
while (j < string.length) && (j <= i + 3)
if string[j] == "z"
return true
end
j += 1
end
i += 1
end
return false
end
这个解决方案对我来说似乎不必要地复杂。具体来说,我不明白为什么需要next
。我想知道是否有人可以帮助我理解这个功能。
我的解决方案似乎与我尝试的测试一样有效,但我想知道另一个解决方案是否更好,以及我的解决方案是否存在我尚未遇到的问题。
def nearby_az(string)
i = 0
while i < string.length
while string[i] != "a"
i += 1
end
if string[i + 1] == "z" || string[i + 2] == "z" || string[i + 3] == "z"
return true
else
i += 1
end
return false
end
end
3条答案
按热度按时间nkoocmlb1#
在原始答案中,如果删除
next
,则i
索引将被假定为表示"a"
位置,即使它不是,并且将返回错误的结果。当你向代码传递一个像
"b"
这样的字符串时,它将进入一个无限循环,因为外部条件while i < string.length
无法控制:请注意,一旦
i
超出字符串的最后一个位置,条件string[i]
就变成了nil
,并且string[i] != "a"
将从那里得到满足。1zmg4dgp2#
如果字符串看起来像这样“bbbb...”或者像这样“abb”,你的解决方案将不起作用-也就是说- 1)如果string.length < 4(没有string[i+3]),你的代码将崩溃2)如果字符串中没有“a“,你的代码将崩溃。在这里,“下一个”派上了用场:“next”的目的是跳过循环的其余部分并直接跳回到它的开始。因此,原始的解决方案将首先遍历字符,直到找到“a”(跳过循环的其他部分不是),并且当且仅当它找到“a”时-它会找到“z”。
kx1ctssn3#
所以,正如sawa所说,你的循环不接受没有a的字符串。它也不能理解有多个a的字符串。例如,aaaaaaaz会返回false,因为它找到了第一个a,检查了接下来的3个,没有找到z,然后退出。
你可以通过从末尾删除return false,并在内部循环中添加与外部循环相同的长度条件来解决这个问题。
他对next的用法与上面的相同。这是一种将两件事结合在一起的方式。这是不必要的复杂,我同意。
一个简单得多的方法(假设你不想使用regexp)是只跟踪最后一次出现的“a”。