2016-03-12 139 views
2

我在做一個在線課程:理解「下一個」紅寶石 - 比較方案

編寫需要一個字符串並返回true如果字母"z""a"後的三個字母出現的方法。您可能會認爲該字符串只包含小寫字母。

這是給出瞭解決方案:

def nearby_az(string) 
    i = 0 
    while i < string.length 
    if string[i] != "a" 
     i += 1 
     next 
    end 
    j = i + 1 
    while (j < string.length) && (j <= i + 3) 
     if string[j] == "z" 
     return true 
     end 
     j += 1 
    end 
    i += 1 
    end 
    return false 
end 

該解決方案似乎過於複雜了我。具體來說,我不明白爲什麼需要next。我想知道如果有人能幫我理解這個功能。

我的解決方案似乎與我試圖測試工作爲好,但我想知道,如果其他的解決方案是更好的,如果我的解決辦法有,我只是還沒有碰到過的問題還沒有。

def nearby_az(string) 
    i = 0 
    while i < string.length 
    while string[i] != "a" 
     i += 1 
    end 
    if string[i + 1] == "z" || string[i + 2] == "z" || string[i + 3] == "z" 
     return true 
    else 
     i += 1 
    end 
    return false 
    end 
end 
+2

當你獲得的經驗與紅寶石,你會發現,這個問題可以通過使用正則表達式(「正則表達式」)最容易回答。如果'str'是你的字符串,你可以直接寫'str =〜/ a。{,2} z /'。它的內容是:「匹配一個'a',後跟任意字母('。'),零和兩次之間('{,2}'或'{0,2}'),然後是'z'」。 –

回答

1

在原來的答案,如果您刪除next,該i指數將被假定爲代表,即使是沒有了,會返回一個錯誤的結果的"a"位置。

當你傳似"b"你的代碼的字符串,它會進入一個無限循環,因爲外部條件while i < string.length有無法控制:

while string[i] != "a" 
    i += 1 
end 

注意的是,一旦i超出的最後位置一個字符串,條件string[i]變成nil,並且從那裏將滿足string[i] != "a"

+1

0> = 0,所以外層循環將不允許空字符串。 –

+0

@TimTom謝謝。糾正。 – sawa

1

如果字符串像這種「BBBBB ......」您的解決方案將無法正常工作或類似這樣的「羊毛」 - 那就是 - 1)你的代碼將崩潰,如果string.length減< 4(無串[我+3]) 2)如果字符串中沒有「a」,代碼將崩潰。 這裏「下一個」派上用場: 「下一個」的目的是跳過循環的其餘部分,並直接跳回到開頭。所以最初的解決方案將首先遍歷字符,直到它找到「a」(跳過循環的另一部分不是),並且當且僅當它找到「a」時 - 找到「z」。

+0

它不會崩潰。 – sawa

1

所以,正如薩瓦所說,你的循環不接受字符串沒有一個在他們中。它也不理解具有多個a的字符串。例如aaaaaaaz將返回false,因爲它找到第一個a,檢查下一個3沒有找到z並退出。

您可以通過從最後刪除返回false並將與外部循環相同的長度條件添加到內部循環來解決您的問題。

他接下來的用法等同於上述。這是將這兩件事情聯繫在一起的一種方式。雖然這是不必要的複雜,我同意。

一個更簡單的方法(假設你不想使用正則表達式)就是跟蹤最後一個'a'的發生。

def nearby_az(string) 
    last_a = -4 
    string.chars.each_with_index do |c, i| 
    last_a = i if c == 'a' 
    return true if c == 'z' and i - last_a <= 3 
    end 
    return false 
end