计算字符串中所有出现的数字

时间:2017-01-03 16:05:07

标签: ruby string

您将获得一个字符串S.计算字符串S中所有数字的出现次数。

输入: 第一行包含字符串S

输出: 计算输入数字中出现的次数1并打印输出。  我试图尝试这样的问题:

number=$stdin.gets.chomp
number.split('').map(&:to_i)
number.each do |numbers|
  i==0
  while numbers===1
    i+=1
  end
end

puts i

但是,它没有执行。 有人可以建议我怎么做?

3 个答案:

答案 0 :(得分:5)

在ruby中以干净的方式做你想要的事情

number=$stdin.gets.chomp
number.count('1')

答案 1 :(得分:4)

str = "1a2b &32T2*3"

您可以计算字符串中的总位数,如下所示:

str.count('0123456789')
  #=> 6

如果您希望计算字符串中每个数字的出现次数,您可以使用计算哈希(参见Hash::new):

str.each_char.with_object(Hash.new(0)) { |c,h| h[c] += 1 if c =~ /\d/ }
  #=> {"1"=>1, "2"=>3, "3"=>2}

或使用方法Enumerable#group_by

h = str.each_char.group_by(&:itself).select { |k,_| k =~ /\d/ }
  #=> {"1"=>["1"], "2"=>["2", "2", "2"], "3"=>["3", "3"]}
h.update(h) { |*,v| v.count }
  #=> {"1"=>1, "2"=>3, "3"=>2}

这使用Hash#update(aka merge!)的形式,它使用一个块来确定合并的两个哈希中存在的键的值(这里是所有键)。有关详细信息,请参阅文档。

答案 2 :(得分:2)

您的代码存在一些问题。首先,您实际上没有将numbers设置为数组,您可以通过说numbers = numbers.split('').map(&:to_i)

来实现

然后你应该在循环之外声明i变量。不要说i == 0,而是使用i = 0作为赋值运算符

您应该使用while语句,而不是使用if循环。

此代码假设您的字符串只是所有数字。

numbers = $stdin.gets.chomp
numbers = numbers.split('').map(&:to_i)
i = 0
numbers.each do |number|
  if number === 1
    i += 1
  end
end

如果您的字符串由字母,数字或特殊字符组成,则可以执行此操作

numbers = $stdin.gets.chomp
numbers.split('').select { |c| c=~ /1/ }.length