【发布时间】: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. 当你想要返回一个结果(例如,true或false)以及puts的结果时,通常最好在方法之外puts。这使得该方法更加通用,如果您想在程序的其他地方再次使用它,没有或不同puts消息... -
...3。您应该使用局部变量而不是实例变量(
word1而不是@word,因为实例变量在方法外部可见,这是您不想要的。这不是问题,但除非您需要,否则不要使用实例变量它们在当前范围之外可见。4.您不需要检查长度,除非您出于效率原因想要这样做。5.您不需要join。6.您不需要所有这些临时变量。只需写string_a.downcase.chars.sort == string_b.downcase.chars.sort。也就是说,该方法只需要一行。 -
感谢卡里提供的信息。我不知道在方法之外使用“puts”通常会更好,感谢您对此的帮助。此后,我根据您的建议修改了我的代码,它不仅小得多,而且 100% 正确。非常感谢你和 tadman!
标签: ruby