在一个数组中,计算正数并给予负数之和(Ruby)

l2osamch  于 2022-11-04  发布在  Ruby
关注(0)|答案(3)|浏览(153)

问题说:
给定一个整数数组。
返回一个数组,其中第一个元素是正数的计数,第二个元素是负数的和。0既不是正数也不是负数。
如果输入为空数组或为null,则返回空数组。

def count_positives_sum_negatives(last)
     pos = []
     neg = []

     x = lst.each

      if x % 2 == 0
       pos.push x
       else neg.push x
      end
     y = pos.count
     z = neg.sum

   puts "[#{y},#{z}]"
  end

我用

count_positives_sum_negatives([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, -11, -12, -13, -14, -15])
 #should return [10, -65]

我不确定为什么我的一个只给出一个错误消息:

An error occurred while loading spec_helper.
Failure/Error: if (x % 2) == 0

NoMethodError:
  undefined method `%' for #<Enumerator: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, -11, -12, -13, -14, -15]:each>

# ./lib/solution.rb:7:in `count_positives_sum_negatives'

# ./lib/solution.rb:18:in `<top (required)>'

# ./spec/spec_helper.rb:1:in `require'

# ./spec/spec_helper.rb:1:in `<top (required)>'

No examples found.
No examples found.
fcg9iug3

fcg9iug31#

当然,您指的是lst.each do |x|而不是x = lst.each。您会得到这样的错误,因为没有块的lst.each返回Enumerator对象,而该对象不响应%

def count_positives_sum_negatives(lst)
  pos = []
  neg = []

  lst.each do |x|
    if x % 2 == 0
      pos.push x
    else 
      neg.push x
    end
  end

  y = pos.count
  z = neg.sum

  puts "[#{y},#{z}]"
end

注意:x % 2 == 0可以写成x.even?
但是你看到的是偶数和奇数,你的描述是计数 * 正 * 和求和 * 负 *,你可以使用#positive?#negative?,沿着#partition

def count_positives_sum_negatives(lst)
  pos, neg = lst.partition(&:positive?)

  y = pos.count
  z = neg.sum

  puts "[#{y},#{z}]"
end

您也可以使用#each_with_object来给予您要寻找的信息。

def count_positives_sum_negatives(lst)
  lst.each_with_object([0, 0]) do |x, arr|
    if x.positive?
      arr[0] += 1
    else 
      arr[1] += x
    end
  end
end
pb3s4cty

pb3s4cty2#

@Chris已经给出了问题的原因。
我想我会倾向于这样写。
第一个
这有一个缺点,即创建了一个临时数组(non_pos),但是lst.size - non_pos.sizenon_pos.sum都是相对较快的计算,后者是因为它是在C中实现的。
lst.reject(&:positive?)lst.reject { |n| n.positive? )的缩写形式。
参见数组#reject和数组#sum。

5hcedyr0

5hcedyr03#

好的,我完成的最后一个输出正确答案,但我认为门户本身已损坏,因为它无法区分[10,-65]与[10,-65] enter image description here相同

def count_positives_sum_negatives(lst)
  pos = []
  neg = []

  lst.each do |x|
    if x.positive?
      pos.push x
    else 
      neg.push x
    end
  end

  y = pos.count
  z = neg.sum

  final = []
 final << y
 final << z

  print final
end

相关问题