如何找到第二个最小的数字并返回其索引?
答案 0 :(得分:3)
另一种方法:
>> a = [1,3,5,6,2,4]
=> [1, 3, 5, 6, 2, 4]
>> a.index(a.sort[1])
=> 4
>>
答案 1 :(得分:1)
我可以从头顶看到两个选项:
删除当前分钟,因此新分钟将是前一分钟
arr = num.delete(num.min)
min_bis = arr.min
循环遍历数组,使用2个变量存储2个最低值。 这可能有点棘手,但复杂性只有O(n)。
我不知道为什么你不想对数组进行排序,但如果它是一个性能问题,它可能是最好的选择之一(排序),特别是如果数组很小。
答案 2 :(得分:0)
(下面,Enumerable
是Array
,Hash
和Range
等的超集。)
Enumerable#sort
以排序顺序返回包含原始对象的所有元素的全新数组,因此您可以编写a = num.sort[1]
(假设l > 1
)以查找第二个最小数字, 没有修改原始输入nums
。
然后您可以将其提供给Enumerable#find_index
。
顺便说一下
while (index <l)
nums - gets.to_i
num[index] = nums
index +=1
end
可以写成
nums = (0...l).map{ gets.to_i }
答案 3 :(得分:0)
这是一种不使用sort
的方法:
arr = [3,1,2,5,1]
如果需要second_smallest(arr) => 2
:
def second_smallest(arr)
return nil if arr.uniq.size < 2
mn, mx = arr.min, arr.max
arr.map! { |e| e == mn ? mx : e }
arr.index(arr.min)
end
如果需要second_smallest(arr) => 4
:
def second_smallest(arr)
return nil if arr.uniq.size < 2
i1 = arr.index(arr.min)
arr.delete_at(i1)
i2 = arr.index(arr.min)
i2 >= i1 ? i2 + 1 : i2
end
答案 4 :(得分:0)
我知道你不想在找到第二低的数字之前对数组进行排序。但是你愿意使用该数组的排序克隆/副本吗?
如果
nums = [1, 5, 1, 9, 3, 8]
然后:
# grab a sorted copy of nums
b = nums.sort
# b = [1, 1, 3, 5, 8, 9]
# delete the lowest number
b.delete(b.min)
# now b = [3, 5, 8, 9]
# so get the index from the original array
nums.index(b.first)
应返回4
,因为nums[4] = 3
。 (您也可以使用nums.index(b[0])
,因为b已经排序。)
答案 5 :(得分:0)
如果您不介意破坏原始数组:
a.delete(a.min)
a.index(a.min)
答案 6 :(得分:0)
你不想使用排序,因为它是O(nlogn)。您只需要遍历数组一次(在获得最大值之后):
arr = [123,35,12,34,5,32]
这是解决问题的直接方法:
def second_min_index(arr)
max = arr.max
min, min_index, second_min, second_min_index = max, 0, max, 0
arr.each_with_index do |e, i|
# if something is less than min, second min should become what used to be min
if (e <= min)
second_min, second_min_index, min, min_index = min, min_index, e, i
# if something is less than second min (but not less than min)
# it becomes the second min
elsif (e < second_min)
second_min, second_min_index = e, i
end
end
second_min_index
end
second_min_index(arr)
=> 2
更好,更可重复的方法是通过转换和征服解决方案(以防万一你被要求提供第三个最小数字):
def min_index(arr)
min, min_index = arr[0], 0
arr.each_with_index { |e,i| min, min_index = e,i if e < min }
min_index
end
def min_index_excluding(arr, exclude_indexes)
min, min_index = arr[0], 0
arr.each_with_index { |e,i| min, min_index = e,i if (e < min && !exclude_indexes.include?(i)) }
min_index
end
def second_min_index(arr)
min_index_excluding(arr, [min_index(arr)])
end
second_min_index(arr)
=> 2
答案 7 :(得分:0)
a_sorted = a.sort
second_min = a_sorted[1]
a.index(second_min)
答案 8 :(得分:0)
array.index(array.min(2)[1])
array.min(2)返回数组中的两个最小值,然后用[1]得到第二个值。我们现在可以使用.index()函数获取索引。
请注意,此解决方案仅返回值的第一个出现的索引。