Ruby - 在数组中找到第三大值 - 需要帮助理解方法。

时间:2016-11-20 18:35:51

标签: ruby

新编码!我喜欢它并且已经做了很多练习问题,以帮助我获得我想申请明年的课程资格。对于你们中的许多人来说,这可能是一个非常简单的问题,提前感谢你的帮助。

列出的问题之一是在数组中找到第三个最大值。这很容易。

然而,我正在做的编码问题带有一个解决方案,它通常是一个不使用大量内置方法的解决方案,因此我很难理解。

    #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

1 个答案:

答案 0 :(得分:0)

提供的解决方案会跟踪数组中的firstsecondthird最大值。这些都以nil开头。 while循环一次一个地遍历数组中的每个元素,并将该元素与当前最大的3个值(即迄今为止看到的最大3个值)进行比较,因为我们正在通过数组)。如果其中任何一个&#34;前3&#34;值仍为nil,或者如果要检查的当前元素大于任何值,则将当前值插入&#34;前3&#34;中的正确位置。 (通过将其分配给firstsecondthird,但仅限于第一次&#34;转换&#34;那些&#34;前3&中包含的预先存在的值#34;变量)。

例如,如果first目前为7,则second4third3,且当前元素为我正在检查10,然后我想将4(即second)转移到third位置,然后转移7(即{{ 1}})进入first位置,然后将second指定为新的10

您的解决方案具有更易于阅读(和编写)的优势。您可能想知道所提供的解决方案的相对复杂性是否有任何优势。有。我不知道你是否已经了解时间复杂度/ Big O表示法,但是,所提供的解决方案是first(因为它基本上只是通过数组进行单循环),这将具有更好的性能与您的解决方案相比,平均值为O(n)(任何涉及对数组进行排序的算法的最佳/最低时间复杂度)。