【问题标题】:Understanding 'next' in ruby - comparing solutions了解 ruby​​ 中的“下一步” - 比较解决方案
【发布时间】:2016-06-28 00:52:32
【问题描述】:

我正在学习在线课程:

如果"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

【问题讨论】:

  • 当您获得 Ruby 的经验时,您会发现使用正则表达式(“regex”)可以最轻松地回答这个问题。如果str 是你的字符串,你可以简单地写str =~ /a.{,2}z/。其内容为“匹配 'a' 后跟零到两次之间的任意字母 (.)({,2}{0,2}),后跟 'z'”。

标签: ruby iteration next


【解决方案1】:

在原始答案中,如果您删除next,则i 索引将被假定代表"a" 位置,即使它不是,并且将返回错误结果。

当您将"b" 之类的字符串传递给您的代码时,它将进入无限循环,因为外部条件while i &lt; string.length 无法控制:

while string[i] != "a"
  i += 1
end

请注意,一旦i 超出字符串的最后一个位置,条件string[i] 将变为nil,并且从那里开始满足string[i] != "a"

【讨论】:

  • 0 >= 0,所以外循环不允许空字符串。
  • @TimTom 谢谢。已更正。
【解决方案2】:

如果字符串看起来像这样“bbbbb...”或像这样“abb”,那么您的解决方案将不起作用 - 也就是说 - 1) 如果 string.length

【讨论】:

  • 它不会崩溃。
【解决方案3】:

因此,正如sawa 所说,您的循环不接受其中没有a 的字符串。它也不理解带有多个 a 的字符串。例如 aaaaaaaaz 将返回 false,因为它找到了第一个 a,检查下一个 3 没有找到 z 并退出。

您可以通过从末尾删除 return false 并将与外部循环相同的长度条件添加到内部循环来解决您的问题。

他对next的使用和上面是等价的。这是一种将两件事串在一起的方法。不过,我同意它是不必要的复杂。

一种更简单的方法(假设您不想使用正则表达式)是只跟踪“a”的最后一次出现。

def nearby_az(string)
  last_a = -4
  string.chars.each_with_index do |c, i|
    last_a = i if c == 'a'
    return true if c == 'z' and i - last_a <= 3
  end
  return false
end

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-16
    • 1970-01-01
    • 2020-05-14
    • 2023-02-08
    • 1970-01-01
    相关资源
    最近更新 更多