我想编写一个将数组拆分为两个数组的程序,其中一个数组中的任何元素都小于另一个数组中的任何元素。
我的输入是:
a = [6, 45, 23, 65, 17, 48, 97, 32, 18, 9, 88]
我想要像这样的输出:
[6, 23, 17, 18 , 9] < [45, 65, 48, 97, 32, 88]
我试过了:
i = 0
max = 0
while i < a.size
if a[i] > max
max = a[i]
end
i+=1
end
puts "this is the larger array: " + max.to_s
哪个完全没了。由于我是新手,所以我们非常感谢您的帮助。
答案 0 :(得分:4)
small, large = a.sort!.shift(a.size/2) ,a
p small, large
#=> [6, 9, 17, 18, 23]
#=> [32, 45, 48, 65, 88, 97]
答案 1 :(得分:2)
试试这个:
newarray = a.sort.each_slice((a.size/2.0).round).to_a
它将为您提供一个包含split数组的数组:
newarray = [[6,9,17,18,23,32],[45,48,65,88,97]]
在这种情况下,如果数组中有奇数个元素,则返回的第一个数组将始终具有额外元素。如果您愿意,也可以单独保存数组,但这样您可以使用newarray [0]和newarray [1]调用每一半。如果你想拆分它们,只需添加:
b = newarray[0]
c = newarray[1]
答案 2 :(得分:0)
不要使用while循环 - 对数组进行排序,然后将其拆分为两个
a.sort
a.in_groups_of( a.size/2)
a.sort.each_slice( a.size/2) probably does the trick without rails.
答案 3 :(得分:0)
假设您要保留订单,例如:
def split_it(a,n)
f = a.select {|e| e <= n}
[f, a-f]
end
a = [6, 45, 23, 65, 17, 48, 97, 32, 18, 9, 88]
f, l = split_it(a,23)
puts "#{f} < #{l}" # => [6, 23, 17, 18, 9] < [45, 65, 48, 97, 32, 88]
如果您想保留订单并让第一个子数组包含nbr
元素,请添加以下内容:
def split_nbr(a, nbr)
n = 1
loop do
return [] if n > a.max
b = split_it(a,n)
return b if b.first.size == nbr
n += 1
end
end
f, l = split_nbr(a,3)
puts "#{f} < #{l}" # => [6, 17, 9] < [45, 23, 65, 48, 97, 32, 18, 88]
答案 4 :(得分:0)
a = [6, 45, 23, 65, 17, 48, 97, 32, 18, 9, 88]
a = a.sort
print a.shift(a.count/2), " < " , a
#=> [6, 9, 17, 18, 23] < [32, 45, 48, 65, 88, 97]
另一种变化
a = [6, 45, 23, 65, 17, 48, 97, 32, 18, 9, 88]
a = a.sort
print a.values_at(0..a.count/2), " < ", a.values_at((a.count/2)+1 .. -1)
#=> [6, 9, 17, 18, 23] < [32, 45, 48, 65, 88, 97]