【问题标题】:Ruby Anagram Comparison ModuleRuby Anagram 比较模块
【发布时间】:2016-01-05 02:56:17
【问题描述】:

我是 Ruby 新手,正在尝试找出在线测试的问题。问题如下:

字谜是由另一个单词通过重新排列其字母而形成的单词, 只使用一次所有原始字母;例如管弦乐队 可以重新排列成carthors。

编写一个函数来检查两个单词是否是彼此的字谜。

例如,AreAnagrams.are_anagrams?('momdad', 'dadmom') 应该 返回 true,因为参数是字谜。

我想出的代码是这样的:

module AreAnagrams
  def self.are_anagrams?(string_a, string_b)
      ## Create @word1 variable to store string_a
      @word1 = string_a

      ## Create @word1_compare variable to store string_a in lower case
      @word1_compare = @word1.downcase

      ## Create @word2_compare variable to store string_b
      @word2 = string_b

      ## Create @word2_compare variable to store string_b in lower case
      @word2_compare = @word2.downcase

      ## Check length of @word1 and @word2 to make sure they are the same length
      if @word1.length == @word2.length

      =begin
        Sort the letters of the @word1 and @word2 variables and compare
        them to see if they are anagrams
      =end

      if @word1_compare.chars.sort.join == @word2_compare.chars.sort.join
          puts "#{@word1} and #{@word2} are anagrams!"
      else
          puts "#{@word1} and #{@word2} are not anagrams!"
      end
      else
          puts "#{@word1} and #{@word2} are not anagrams!"
      end
  end
end

当我提交代码时,我从测试中得到以下信息:

编译正常,但 4 个测试用例中有 4 个失败

示例案例:错误答案

具有唯一字母的单词:错误答案

有重复字母的单词:错误答案

一个词是另一个词的前缀:错误答案

我已经用多个字符串测试了我的代码,它似乎工作得很好。看起来它希望我检查更具体的实例(特殊字符、带有重复字母的单词等),但这真的需要吗?对不起,如果这是一个愚蠢的问题,我是 Ruby 新手,迷路了。

任何帮助将不胜感激!

【问题讨论】:

  • 既然这是一个类方法,你应该真的避免在这里使用实例变量。这些将在方法调用之间持续存在,您可能并不打算这样做。只需使用常规局部变量,不需要@
  • 听起来不错,我也会更正我的变量。非常感谢,再次感谢您!
  • @tadman 已经回答了您的问题,但是您可以采取一些措施来改进您的方法。 1,问题没有要求你puts,所以你应该删除它。 2. 当你想要返回一个结果(例如,truefalse)以及puts 的结果时,通常最好在方法之外puts。这使得该方法更加通用,如果您想在程序的其他地方再次使用它,没有或不同 puts 消息...
  • ...3。您应该使用局部变量而不是实例变量(word1 而不是 @word,因为实例变量在方法外部可见,这是您不想要的。这不是问题,但除非您需要,否则不要使用实例变量它们在当前范围之外可见。4.您不需要检查长度,除非您出于效率原因想要这样做。5.您不需要join。6.您不需要所有这些临时变量。只需写string_a.downcase.chars.sort == string_b.downcase.chars.sort。也就是说,该方法只需要一行。
  • 感谢卡里提供的信息。我不知道在方法之外使用“puts”通常会更好,感谢您对此的帮助。此后,我根据您的建议修改了我的代码,它不仅小得多,而且 100% 正确。非常感谢你和 tadman!

标签: ruby


【解决方案1】:

我认为这里的问题是您正在显示一条消息,但没有返回预期的 truefalse 值。

在每个puts 之后,包括适当的答案。这样你的方法就会返回一些有用的东西。现在我假设所有情况下都是nil,因为这是puts 返回的内容。

【讨论】:

  • 既然您已经确定了问题所在,或许可以谈谈如何改进代码...
  • @CarySwoveland 我认为这很清楚。所需要做的就是在每次放置后添加truefalse
  • 临时变量的使用、实例变量的使用、方法内部有'puts
  • @CarySwoveland 上面已经对问题本身发表了评论,希望对您有所帮助。这是一个 90% 的解决方案,我只是克服困难。剩下的就是技巧。
  • 谢谢塔德曼!我所要做的就是将“puts”行替换为“return true”或“return false”,瞧。
猜你喜欢
  • 2017-07-18
  • 2016-02-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-08
  • 1970-01-01
  • 2019-08-15
相关资源
最近更新 更多