新编码!我喜欢它并且已经做了很多练习问题,以帮助我获得我想申请明年的课程资格。对于你们中的许多人来说,这可能是一个非常简单的问题,提前感谢你的帮助。
列出的问题之一是在数组中找到第三个最大值。这很容易。
然而,我正在做的编码问题带有一个解决方案,它通常是一个不使用大量内置方法的解决方案,因此我很难理解。
#my solution
def third_greatest(num)
array = num.sort.reverse
return array[2]
end
我想知道的是while循环如何在他们的解决方案中运行。我似乎无法理解发生了什么。
#their solution
def third_greatest(nums)
first = nil
second = nil
third = nil
idx = 0
while idx < nums.length
value = nums[idx]
if first == nil || value > first
third = second
second = first
first = value
elsif second == nil || value > second
third = second
second = value
elsif third == nil || value > third
third = value
end
idx += 1
end
return third
end
答案 0 :(得分:0)
提供的解决方案会跟踪数组中的first
,second
和third
最大值。这些都以nil
开头。 while
循环一次一个地遍历数组中的每个元素,并将该元素与当前最大的3个值(即迄今为止看到的最大3个值)进行比较,因为我们正在通过数组)。如果其中任何一个&#34;前3&#34;值仍为nil
,或者如果要检查的当前元素大于任何值,则将当前值插入&#34;前3&#34;中的正确位置。 (通过将其分配给first
,second
或third
,但仅限于第一次&#34;转换&#34;那些&#34;前3&中包含的预先存在的值#34;变量)。
例如,如果first
目前为7
,则second
为4
,third
为3
,且当前元素为我正在检查10
,然后我想将4
(即second
)转移到third
位置,然后转移7
(即{{ 1}})进入first
位置,然后将second
指定为新的10
。
您的解决方案具有更易于阅读(和编写)的优势。您可能想知道所提供的解决方案的相对复杂性是否有任何优势。有。我不知道你是否已经了解时间复杂度/ Big O表示法,但是,所提供的解决方案是first
(因为它基本上只是通过数组进行单循环),这将具有更好的性能与您的解决方案相比,平均值为O(n)
(任何涉及对数组进行排序的算法的最佳/最低时间复杂度)。