2016-11-20 58 views
0

編程新手!我喜歡它,並且一直在做很多練習題,以幫助我申請明年申請的課程。對於你們中的很多人來說,這可能是一個非常簡單的問題,在此先感謝您的幫助。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 
+0

的冗長溶液跟蹤每次迭代的頂部最高3個的值。在每次迭代時,它根據它所看到的數組中的下一個值重新排列前3位。你應該手動運行一個簡單的例子,你會看到它是如何工作的。 – lurker

+0

這兩種解決方案都可能存在缺陷。還要考慮在數組中有重複值時會發生什麼情況,除非聲明輸入不包含重複項。 – Oka

+1

通過手動追蹤程序是必不可少的技能。拿出一張紙和一支鉛筆(或使用白板或黑板)並解決一個小問題 - 逐行進行,並根據說明記錄或更新變量的值。 – pjs

回答

0

所提供的溶液跟蹤在陣列中的firstsecond,和third最大的值。這些都以nil開始。循環遍歷數組中的每個元素,並將該元素與當前最大的3個值進行比較(即,當我們按照數組的方式工作時,迄今爲止看到的最大3個值)。如果任何這些「頂部3」的值仍然nil,或者如果被檢查的當前元素是比任何這些值越大,則該電流值被插入在「頂3」(正確的位置由分配給它要麼firstsecond,或third,但只有在第一個「移過」包含在那些「頂3」變量預先存在的值)。

例如,如果first目前7second4,並third3,而我檢查當前元素爲10,然後我要轉移4(即second)爲third的地方,然後按住Shift鍵7(即first)插入到位second,然後分配10成爲新first


您的解決方案具有讀取(寫入)更簡單的優點。您可能想知道,由於提供的解決方案相對複雜,是否有任何優勢。有。我不知道你是否已經瞭解時間複雜度/大O符號,但是提供的解決方案是O(n)(因爲它基本上只是通過陣列進行單一循環),與您的解決方案相比,平均具有更好的性能,這是O(n log(n))(任何涉及排序數組的算法的最佳/最低可能時間複雜度)。