【问题标题】:Ruby: How to remove specific digits from integers that are inside an array?Ruby:如何从数组内的整数中删除特定数字?
【发布时间】:2018-06-29 19:38:11
【问题描述】:

我是编程新手。我想取一个整数数组,比如[155, 151, 2, 15] 并删除一个特定数字,在本例中为 5,然后将新数字相加。我已经把这个问题分解成更小的步骤,并得到了我想要的结果。我只是想知道是否有更简单的方法来解决这样的问题?也许我可以使用不同的方法?非常感谢任何帮助。

这是我的代码:

 arr = [155, 151, 2, 15]
# goal: remove the 5 digit from values and add 
#       new numbers together --> 1 + 11 + 2 + 1 == 15

# convert to arr of strings and delete zeros
str_arr = []
arr.each do |el|
  str_arr << el.to_s.delete('5')
end

# convert to arr of nums
num_arr = []
str_arr.each do |el|
  num_arr << el.to_i
end

# reduce num_arr
num_arr.reduce(:+)

【问题讨论】:

  • 不是将元素推送到外部数组,而是使用map 返回一个映射值数组。例如,您的第一个示例 arr.map { |e| e.to_s.delete('5') }
  • require 'json'; JSON.parse([155, 151, 2, 15].to_json.delete('5')).sum #=&gt; 15 怎么样?

标签: arrays ruby type-conversion enumerable


【解决方案1】:

也许您可以使用 map 代替 each,这样您就不必将块内转换的每个元素推送到一个新的初始化数组,例如:

p [155, 151, 2, 15].map { |el| el.to_s.delete('5').to_i }.reduce(:+)
# 15

如果使用 ruby​​ 2.4 或更高版本,您可以使用 Enumerable#sum 代替 reduce(这似乎是一个更快的选择)。

p [155, 151, 2, 15].sum { |el| el.to_s.delete('5').to_i }
# 15

【讨论】:

  • [155, 151, 2, 15].sum { |el| el.to_s.delete('5').to_i }
【解决方案2】:
arr = [155, 151, 2, 15]

arr.sum { |n| (n.digits - [5]).reverse.join.to_i }
  #=> 15

【讨论】:

  • digits 从 Ruby 2.4 开始可用。
  • 谢谢@StefanPochmann。我忘记了digits 以低到高的顺序返回数字。我认为添加 reverse 可以解决这个问题,但它会使解决方案变得不那么理想。
  • 是的,这很糟糕。我希望有一种相反方向的方法,从数字数组到整数。但显然他们忘记了这一点。
  • @SagarPandya 我前段时间在某个地方读到过,这是因为他们,基本上是divmod,在他们去的时候通过十个推到一个数组(因此首先去掉最低有效数字),然后一旦它进入他们可以反转阵列,也可以离开阵列。他们决定我们是否需要它,以便我们可以尽可能轻松地反转阵列,所以为什么要浪费时间做不是每个人都需要的工作,如果我们这样做的话,这对我们来说非常容易。但我找不到我在哪里读到的……可能不是官方的,可能只是我试图合理化它。
  • @SagarPandya 位值表示还可以更轻松地将数字转换回整数:digits.each_with_index.sum { |d, i| d * base ** i }
【解决方案3】:

使用eval:

eval(arr.join('+').delete('5'))    
#=> 15

使用inject:

arr.inject(0){|sum, element| element.to_s.delete('5').to_i + sum } 
#=> 15

使用eval 的解决方案更有趣,但使用inject 的解决方案可以说更容易理解。干杯。

【讨论】:

    猜你喜欢
    • 2021-08-20
    • 1970-01-01
    • 2021-07-03
    • 1970-01-01
    • 1970-01-01
    • 2022-01-25
    • 1970-01-01
    • 1970-01-01
    • 2018-03-25
    相关资源
    最近更新 更多