Ruby:如何从数组内的整数中删除特定数字?
Posted
技术标签:
【中文标题】Ruby:如何从数组内的整数中删除特定数字?【英文标题】:Ruby: How to remove specific digits from integers that are inside an array? 【发布时间】: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 #=> 15
怎么样?
【参考方案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
的解决方案可以说更容易理解。干杯。
【讨论】:
以上是关于Ruby:如何从数组内的整数中删除特定数字?的主要内容,如果未能解决你的问题,请参考以下文章
2021-08-11:按要求补齐数组。给定一个已排序的正整数数组 nums,和一个正整数 n 。从 [1, n] 区间内选取任意个数字补充到 nums 中,使得 [1, n] 区间内的任何数字都可以用