Ruby:插入和排序数字

时间:2016-11-23 22:27:13

标签: arrays ruby sorting

我必须在Ruby中创建一个方法,它插入一个数字并对结果列表进行排序。

输入就像:

insert_number([2.0,3.5,4.8], 4.1) 

应输出:

[2.0,3.5,4.1,4.8]

输入如:

insert_number([], 5.1) 

它应输出:

[5.1]

这是我不完整的代码:

def insert_number(list, number)
  new_list = []               
  position = 0                         
  number_has_been_inserted = false     # Remember whether a new number 
  # has been inserted.
  while position < list.length 
    position += 1
    new_list = list + [number] 
    ...
  end
  ...
    new_list
end

print insert_number([2.0,3.5,4.8], 4.1)

6 个答案:

答案 0 :(得分:3)

我会做类似的事情:

def insert_number(list, number)
  (list << number).sort
end

list = [1, 2, 3]
insert_number(list, 2.1) # => [1, 2, 2.1, 3]
insert_number(list, 4.1) # => [1, 2, 2.1, 3, 4.1]
insert_number([], 1) # => [1]

问题在于此更改list。如果不需要,请使用dup

def insert_number(list, number)
  (list.dup << number).sort
end

list = [1, 2, 3]
insert_number(list, 2.1) # => [1, 2, 2.1, 3]
insert_number(list, 4.1) # => [1, 2, 3, 4.1]
insert_number([], 1) # => [1]

或“splat”AKA *

def insert_number(list, number)
  [*list, number].sort
end

list = [1, 2, 3]
insert_number(list, 2.1) # => [1, 2, 2.1, 3]
insert_number(list, 4.1) # => [1, 2, 3, 4.1]
insert_number([], 1) # => [1]

[*list, number]告诉Ruby将数组list分解为其元素,有效地创建了一个新数组:

[1, 2, 3, number]

答案 1 :(得分:3)

  

bsearch仅在原始输入数组已经排序时才有效,这不是前置条件。 - @pjs

考虑到您的原始数组已排序,您可以在此处使用二进制搜索。它会表现得更好,因为它不需要在每个插件上执行昂贵的排序程序。

这个变异原始数组

def insert_number(arr, num)
  i = (0...arr.size).bsearch{ |a| arr[a] > num }
  i ||= arr.size
  arr.insert(i, num)
end

arr = []
insert_number(arr, 1)
#=> [1]
insert_number(arr, 2)
# => [1, 2]
insert_number(arr, 2.1)
# => [1, 2, 2.1]
insert_number(arr, 1.3)
#=> [1, 1.3, 2, 2.1]

这个将在每次调用时返回新数组

def insert_number(arr, num)
  i = (0...arr.size).bsearch{ |a| arr[a] > num }
  i ||= arr.size
  arr[0, i] + [num] + arr[i..-1]
  # or
  # arr.dup.insert(i, num)
end

arr = []
arr = insert_number(arr, 1)
#=> [1]
arr = insert_number(arr, 2)
# => [1, 2]
arr = insert_number(arr, 2.1)
# => [1, 2, 2.1]
arr = insert_number(arr, 1.3)
#=> [1, 1.3, 2, 2.1]

PS:

  

最近的Ruby版本有bsearch_index - @Stefan

答案 2 :(得分:2)

更短一点而不必使用dup。

def insert_number(list, number) (list + [number]).sort end

答案 3 :(得分:1)

使用Array#sort

def insert_number(list,number=false)
  number.is_a?(Numeric) ? list.push(number).sort : list.sort
end

上述方法使用三元运算符,它是if语句的缩写形式。

答案 4 :(得分:0)

使用就地数组方法

阵列上的就地操作应该是最快的,因为它们不必创建其他阵列。例如:

@array = [2.0, 3.5, 4.8]

def insert_number float
  (@array << float).sort!
end

如果您无法直接在共享变量上操作,或者想要减少耦合,那么您仍然可以使用就地排序来节省一些时间,而不是返回 new 排序数组:< / p>

def insert_number array, float
  (array.dup << float).sort!
end

在所有情况下,使用<<追加数组应该比使用+方法创建新数组更快。

答案 5 :(得分:0)

实际上我们不需要任何排序,因为我们知道我们的数组是排序的,然后当我们将新的数字x时,我们可以将它放入数组中,其中有O(n)时间,其中n是数组的大小。我们将逐一进行,让我们i as index,我们的新数组将像NewArray = (left numbers < x) + x + (x < right number): left numbers一样构建right number数字小于x且ispushed = false arr.each do |number| if number < x NewArray.push(number) elsif ispushed == false ispushed=true NewArray.push(x) newArray.push(number) else NewArray.push(number) 是数字大于x。

(Get-Date).Month

如果我们的x最大,那么ispushed将保持错误 最后,我们可以推动我们的&#39; x&#39;编号

如果您使用排序,则按O(nlogn)时间复杂度

工作