1 . 我能够遍历数组并实现它。但是,它返回 nil而不是 digits 9 -6ren">
gpt4 book ai didi

arrays - 遍历数组以找到超过 10 的 int 并将这两个数字加在一起

转载 作者:太空宇宙 更新时间:2023-11-03 17:09:32 25 4
gpt4 key购买 nike

尝试遍历和数组,对于任何 10 或更高的数字,拆分这些数字并将它们加在一起,例如:10 > "1" "0" > 1 .

我能够遍历数组并实现它。但是,它返回 nil而不是 digits < 9 .

def over_ten_sum
#splits the numbers over 10 into seperate digit and sums them
square_odd.map do |num|
if num > 9
num.to_s.chars.each_slice(2).map { |num_1, num_2| num_1.to_i + num_2.to_i }
end
end
end

值为 [6, 4, 10, 2, 14, 7, 8, 4, 6, 7, 18, 4]它返回:

=> [nil, nil, [1], nil, [5], nil, nil, nil, nil, nil, [9], nil]

我试图让输出是 [6, 4, 1, 2, 5, 7, 8, 6, 7, 9, 4]

只是没有看到这里断开连接。预先感谢您提供任何见解。

最佳答案

假设你要写

[1, 2, 3].map { |n| }
#=> [nil, nil, nil]

nil 的数组返回 s 是因为 map返回 nil对于 n如果n block 中没有赋值。同样,

[1, 2, 3].map { |n| 2*n if n > 1 }
#=> [nil, 4, 6]

这与 OP 代码的问题非常相似。如果有人不想要 nil返回数组中的 s 只需要将数组的每个元素映射到一个非 nil 值:

[1, 2, 3].map { |n| n > 1 ? 2*n : n }
#=> [1, 4, 6]

现在让我们看看这条线

num.to_s.chars.each_slice(2).map { |num_1, num_2| num_1.to_i + num_2.to_i }

如果num = 34 ,这将返回 [7] , 除了 7在一个数组中,是正确的。另一方面,如果 num = 134表达式返回 [4, 4] (即 [1+3, 4] ),我不希望这是想要的。但是,如果数字总是有两位数字,则上面的表达式与:

num[0].to_i + num[1].to_i

这要简单得多。1为了使其更通用,您需要编写如下内容2:

def over_nine_sum(arr)
arr.map { |n| n > 9 ? n.to_s.each_char.reduce(0) { |t,s| t + s.to_i } : n }
end

over_nine_sum [12, 5, 71, 3]
#=> [3, 5, 8, 3]

参见 Enumerable#reduce (又名 inject)。

@JörgWMittag 指出(见评论)单个数字的数字总和 ( 0-9 ) 与数字本身相同,因此无需区别对待这些数字。因此我们可以写

def sum_digits(arr)
arr.map { |n| n.to_s.each_char.reduce(0) { |t,s| t + s.to_i } }
end

sum_digits [12, 5, 71, 3]
#=> [3, 5, 8, 3]

正如@steenslag 在评论中所建议的,这可以简化为

def sum_digits(arr)
arr.map { |n| n.digits.sum }
end

它使用方法 Integer#digitsArray#sum (在 Ruby v2.4 中都是新的)。

考虑当 sum_digits 时的步骤(对于上面 n = 34 的第一个版本) :

n.to_s.each_char.reduce(0) { |t,s| t + s.to_i }
#=> 34.to_s.each_char.reduce(0) { |t,s| t + s.to_i }
#=> "34".each_char.reduce(0) { |t,s| t + s.to_i }

现在reduce初始化 block 变量 t (返回的“备忘录”)归零并传递 "34" 的第一位数字到 block 并将其分配给 block 变量 s :

t = 0
s = "3"

区 block 计算为:

t + s.to_i
#=> 0 + "3".to_i
#=> 3

这是t的更新值.接下来,

s = "4"
t + s.to_i
#=> 3 + "4".to_i
#=> 3 + 4
#=> 7

1。另一个问题是如果 square_odd是局部变量,Ruby 会在计算它时引发“ undefined variable 或方法”异常。

2。 n.to_s.each_char.reduce(0)...优于 n.to_s.chars.reduce(0)...因为chars返回一个临时数组,而 each_char返回一个枚举数。

关于arrays - 遍历数组以找到超过 10 的 int 并将这两个数字加在一起,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43815901/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com