gpt4 book ai didi

ruby - 如何从数组中删除后跟相同元素的元素

转载 作者:数据小太阳 更新时间:2023-10-29 07:54:58 24 4
gpt4 key购买 nike

我有一个数组。在索引 37 处有两个 46:

arr = [7, 68, 42, 46, 9, 91, 77, 46, 86, 1]

我的任务是使用 selection sort 对这个数组进行排序,但不是 .sort。结果应该是:

[1, 7, 9, 42, 46, 46, 68, 77, 86, 91]

因此,我在 .rb 文件中执行了此操作:

def insertion_sort(arr)
length = arr.size
arr.each_with_index do |number, index|
puts "Now the index is #{index}"
current_minimum = arr.last(length - index).min
puts "Now the current_minimum in last#{length - index} elements is #{current_minimum}"
arr.delete(current_minimum)
arr.insert(index, current_minimum)
end
end

arr = [7, 68, 42, 46, 9, 91, 77, 46, 86, 1]
answer = insertion_sort(arr)
puts answer.to_s

我执行了这个文件,然后得到了这个:

[1, 7, 9, 42, 68, 91, 77, 86, 46]

如果我删除一个 46,结果是这样的:

[1, 7, 9, 42, 46, 68, 77, 86, 91]

当数组中的某个值多次出现时,我的代码不起作用。当 each_with_index block 转到索引 3 时,它从数组的其余部分删除了所有 46

谁能告诉我如何纠正这个问题?

最佳答案

要“模拟”这种选择排序,您可以尝试使用从 0 开始的范围作为索引 0 的值,并将数组的长度作为最后一个元素来迭代数组。此范围不会采用最后一个数组值。

使用 each 您可以访问创建范围中的 each 值,然后,使用该“索引”,您可以创建一个新范围,同样无需获取最后一个范围元素,但这次向前迈进了一步,即将 a 的当前值加 1。同样,使用 each,您可以从之前创建的“parent”和“child”范围中访问 ab

现在您可以检查数组中索引为 b 的元素的值是否小于数组中索引为 a 的元素的值,如果这验证为真然后创建一个 temp 变量,其中包含索引为 b 的数组中元素的值,然后是数组中位于位置 (index) b 的元素 将等于数组中位置为 a 的元素,最后数组中位置为 a 的元素将等于 之前创建的 temp 变量。

最后返回作为参数传递的数组。

def insertion_sort(array)
(0...array.length).each do |a|
((a+1)...array.size).each do |b|
if array[b] < array[a]
temp = array[b]
array[b] = array[a]
array[a] = temp
end
end
end
array
end

arr = [7, 68, 42, 46, 9, 91, 77, 46, 86, 1]
p insertion_sort(arr)
# => [1, 7, 9, 42, 46, 46, 68, 77, 86, 91]

正如@MarkThomas 所添加的,您可以通过使用ab 索引交换数组值来“跳过”temp 变量:

def insertion_sort(array)
(0...array.length).map do |a|
((a+1)...array.size).each do |b|
array[a], array[b] = array[b], array[a] if array[b] < array[a]
end
end
array
end

关于ruby - 如何从数组中删除后跟相同元素的元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44621317/

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