2014-06-24 14 views
0

我目前正在通過Coderbyte系列,以更好地在Ruby編程。也許這只是他們網站上的一個錯誤(我不知道),但是除Coderbyte之外,我的代碼在其他地方都適用。Coderbyte Coderbyte CodeGo.net> Coderbyte第二偉大的低碼工作,但被拒絕

該方法的目的是返回任何輸入數組中的第二小元素和第二大元素。

代碼:

def SecondGreatLow(arr) 
    arr=arr.sort! 
    output=[] 
    j=1 
    i=(arr.length-1) 
    secSmall='' 
    secLarge='' 
    while output.length < 1 
    unless arr.length <= 2 
     #Get second largest here 
     while (j<arr.length) 
     unless arr[j]==arr[j-1] 
      unless secSmall != '' 
      secSmall=arr[j] 
      output.push(secSmall) 
      end 
     end 
     j+=1 
     end 
     #get second smallest here 
     while i>0 
     unless arr[i-1] == arr[i] 
      unless secLarge != '' 
      secLarge=arr[i-1] 
      output.push(secLarge) 
      end 
     end 
     i-=1 
     end 


    end 
    end 



    # code goes here 
    return output 

end 


# keep this function call here 
# to see how to enter arguments in Ruby scroll down 
SecondGreatLow(STDIN.gets) 

輸出

  1. 輸入:[1,2,3,100] =>輸出:[2,3](正確)
  2. 輸入:[1 ,42,42,180] =>輸出:[42,42](正確)
  3. 輸入:[4,90] =>輸出:[90,4](正確)

問題是,我被授予0分,它告訴我,我的輸出是不正確的每個測試。然而,當我真的投入任何投入時,它給了我期望的輸出。有人可以幫助解決這個問題嗎?謝謝!

更新 由於@pjs回答以下,我意識到這可能在短短的幾行來完成:

def SecondGreatLow(arr) 
    arr=arr.sort!.uniq 
    return "#{arr[1]} #{arr[-2]}"  
end 

# keep this function call here 
# to see how to enter arguments in Ruby scroll down 
SecondGreatLow(STDIN.gets) 
+1

您的方法需要一個數組但是['STDIN.gets'](http://www.ruby-doc.org/core-2.1.2/IO.html#method- i-gets)返回一個字符串。 – Stefan

+0

@Stefan你說得對,但是Coderbyte網站提供了測試數組的輸入示例。我繼續寫下一個解決方案,其中第一行是'arr = arr.split(/ [,] + /)。 n.to_i}如果arr.is_a?字符串「,並且似乎通過了他們的測試,無論輸入是字符串還是數組。 – pjs

回答

2

重要的是要密切關注這個問題的規範是非常重要的。 Coderbyte說輸出應該是由空格分隔的值,即一個字符串,而不是一個數組。請注意,他們甚至在「正確的樣本輸出」中加上引號。

撇開,你在做的方式太多的工作來實現這一點。一旦數組被排序,所有你需要的是第二個元素,一個空格,倒數第二個元素。提示:Ruby允許數組的正負索引。結合.to_s和字符串連接,這應該只需要幾行。

如果您擔心最大值和最小值的非唯一編號,您可以在排序後使用.uniq修整陣列。

+0

這就是爲什麼我喜歡這個網站。謝謝@pjs。感謝您的評論,我能夠弄清楚如何將我的代碼從32行壓縮爲5.謝謝!我使用輸出代碼更新了我的問題,以幫助此人的其他人 – tim5046

+0

@tomtom不客氣。你可以在你的解決方案中添加一些小小的調整:'arr.sort!.uniq!'就足夠了,這些方法的'!'版本就地作用於數組,因此不需要賦值'arr = ... '。你的'return'字符串插值效果很好。 – pjs

0

您需要檢查數組何時只包含兩個元素的條件。這裏是完整的代碼:

def SecondGreatLow(arr) 
    arr.uniq! 
    arr.sort! 
    if arr.length == 2 
     sec_lowest = arr[1] 
     sec_greatest = arr[0] 
    else 
     sec_lowest = arr[1] 
     sec_greatest = arr[-2] 
    end 
    return "#{sec_lowest} #{sec_greatest}" 
end 
相關問題