查找列表中第二小数的索引?

时间:2014-02-05 00:29:59

标签: ruby

如何找到第二个最小的数字并返回其索引?

9 个答案:

答案 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)

(下面,EnumerableArrayHashRange等的超集。)

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()函数获取索引。

请注意,此解决方案仅返回值的第一个出现的索引。