Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby 两个测试都返回false,即使在我看来代码执行得很完美 #编写一个接受字符串的方法。您的方法应该返回 #数组中最常见的字母,以及它的次数 #出现了。 # #难度:中等。 def最常用字母(字符串) 字母=0 字母计数=0 idx1=0 mostfreq_字母=0 最大字母计数=0 而idx1_Ruby_Methods - Fatal编程技术网

Ruby 两个测试都返回false,即使在我看来代码执行得很完美 #编写一个接受字符串的方法。您的方法应该返回 #数组中最常见的字母,以及它的次数 #出现了。 # #难度:中等。 def最常用字母(字符串) 字母=0 字母计数=0 idx1=0 mostfreq_字母=0 最大字母计数=0 而idx1

Ruby 两个测试都返回false,即使在我看来代码执行得很完美 #编写一个接受字符串的方法。您的方法应该返回 #数组中最常见的字母,以及它的次数 #出现了。 # #难度:中等。 def最常用字母(字符串) 字母=0 字母计数=0 idx1=0 mostfreq_字母=0 最大字母计数=0 而idx1,ruby,methods,Ruby,Methods,所以在我看来,程序应该设置一个字母,一旦设置好了,就在字符串中循环寻找相同的字母,一旦有了一个,它就加入到字母计数中,然后判断它是否是最大的字母计数,以及这些值是否被存储到最终的返回值中,一旦while循环结束,这个值应该是正确的。然而,我一直在变假。我哪里出错了?您的代码不会向我返回[false,false];但它确实返回了错误的结果。samgak的提示应该会引导您找到bug 但是,对于更简短、更红润的备选方案: # Write a method that takes in a string.

所以在我看来,程序应该设置一个字母,一旦设置好了,就在字符串中循环寻找相同的字母,一旦有了一个,它就加入到字母计数中,然后判断它是否是最大的字母计数,以及这些值是否被存储到最终的返回值中,一旦while循环结束,这个值应该是正确的。然而,我一直在变假。我哪里出错了?

您的代码不会向我返回
[false,false]
;但它确实返回了错误的结果。samgak的提示应该会引导您找到bug

但是,对于更简短、更红润的备选方案:

# Write a method that takes in a string. Your method should return the
# most common letter in the array, and a count of how many times it
# appears.
#
# Difficulty: medium.

def most_common_letter(string)
letter = 0
letter_count = 0
idx1 = 0
mostfreq_letter = 0
largest_letter_count = 0


while idx1 < string.length 
    letter = string[idx1]
    idx2 = 0
    while idx2 < string.length
      if letter == string[idx2]
        letter_count += 1
      end
      idx2 += 1
    end


  if letter_count > largest_letter_count
    largest_letter_count = letter_count
    mostfreq_letter = letter
  end
  idx1 += 1
end

return [mostfreq_letter, largest_letter_count]
end

# These are tests to check that your code is working. After writing
# your solution, they should all print true.

puts(
  'most_common_letter("abca") == ["a", 2]: ' +
  (most_common_letter('abca') == ['a', 2]).to_s
)
puts(
  'most_common_letter("abbab") == ["b", 3]: ' +
  (most_common_letter('abbab') == ['b', 3]).to_s
)

创建一个新的
Hash
,每个条目的默认值为
0
;迭代字符并计算哈希中每个字符的频率;然后找出哪个散列条目最大。当一个散列被迭代时,它会产生对,就像您想要的函数输出一样,所以这也很好。

提示:确保在正确的位置将变量重置为零逻辑中存在缺陷。试着在第二次while循环后调试这个
将“letter:{letter},letter#u count:{letter_count}”
放在第二个while循环之后,看看你是否能找到它。但正如其中一个答案所说,def有更好的方法来做到这一点。
def most_common_letter(string)
  Hash.new(0).tap { |h|
    string.each_char { |c| h[c] += 1 }
  }.max_by { |k, v| v }
end