我必须在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)
答案 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)时间复杂度
工作