【发布时间】:2009-11-16 19:42:57
【问题描述】:
我有一个数组:
[0, 0, 0, 0, 0, 0, 0, 1, 2, 3]
我需要找出不为零的最小元素的索引。我该怎么做?
【问题讨论】:
-
如果你的数组中有几个 1,你想得到什么?
我有一个数组:
[0, 0, 0, 0, 0, 0, 0, 1, 2, 3]
我需要找出不为零的最小元素的索引。我该怎么做?
【问题讨论】:
对于 ruby 1.8.7+:
>> [0,0,2,0,1,3].each_with_index.reject {|(e, i)| e == 0}
=> [[2, 2], [1, 4], [3, 5]]
>> [0,0,2,0,1,3].each_with_index.reject {|(e, i)| e == 0}.min
=> [1, 4]
>> [0,0,2,0,1,3].each_with_index.reject {|(e, i)| e == 0}.min[1]
=> 4
对于 ruby 1.8.6:
a.zip((0...a.size).to_a).reject {|(e, i)| e == 0}.min[1]
(卡盘解决方案)
【讨论】:
inject和reject有什么区别?
inject 将数组减少为单个累加值,而 reject 返回不包含给定块返回 true 的对象的数组版本。
each_with_index 调用替换为 zip((0...a.size).to_a)。总之,a.zip((0...a.size).to_a).reject {|(e, i)| e == 0}.min[1].
a=[0, 0, 0, 0, 0, 0, 0, 1, 2, 3]
i=a.index a.reject{|x|x==0}.min
(i=7)
【讨论】:
最简单的方法: 检查数组的每个元素,保留一个最小的变量,将其设置为等于您遇到的第一个数字(除非为 0,然后丢弃并使用下一个数字)。每当您遇到小于最小值的数字时,请将其设置为最小值。当然,丢弃任何零而不是设置最小值。
更高效: 看起来我们有一个排序数组,如果我们可以利用它来发挥我们的优势,我们可以使用更好的搜索机制,例如快速搜索或二进制搜索。我将描述二进制搜索,因为它很容易理解。
我们的数组是按升序排列的。 检查最中间的元素,将其设置为等于您的最小值(除非 0)。在这个中间元素上将数组分成两半。由于数组是升序的,所以检查左半部分的中点(除非元素为 0,然后检查右)。继续直到拆分时左边只有一个元素。这是你的最低要求。
【讨论】:
我不懂 Ruby,所以无法提供代码,但我立即想到的过程是:
0 条目【讨论】: