2013-10-01 33 views
0

我試圖解決從coderbyte.com以下問題這個JavaScript編碼的挑戰:遇到問題解決從coderbyte

使用JavaScript語言,具備的功能SimpleSymbols(STR)取str參數傳遞並通過返回字符串true或false來確定它是否是可接受的序列。 str參數由+和=符號組成,它們之間有幾個字母(即。++ d + === + C++ == a),字符串爲true,每個字母必須用+符號包圍。所以左邊的字符串是錯誤的。該字符串不會爲空,並且至少有一個字母。

以下是我的嘗試:

function SimpleSymbols(str) { 

    // code goes here 
var abc = 'abcdefghijklmnopqrstuvwxyz'; 

for (var i = 0; i < str.length; i++) { 
    if (abc.indexOf(str[i]) !== -1) { 
     if (str[i-1] + str[i+1] === "++") { 
      return true; 
     } 
     else { 
      return false; 
     } 
    } 
} 

} 

這適用於以下幾種情況:

SimpleSymbols("+a+d+"); // true 
SimpleSymbols("+ab+d+"); // false 
SimpleSymbols("b+d+"); // false 

我發現的唯一的情況下這並沒有提供正確的答案是,當有一個尾隨字母,例如:

SimpleSymbols("+a+b"); // true 

這會返回true,實際上它應該返回false。

注:我假設字符串將是小寫...我沒有處理區分大小寫,但我想要小寫版本工作,然後我會讓它獨立的情況下。

關於我的代碼有什麼問題的任何想法?

回答

0

這會在+符號包圍的第一個成功的字母上返回'true',它不會繼續檢查直到最後。

我還想知道字符串索引是否會在第一個/最後一個字符上出現[i-1],[i+1]?它似乎沒有,但我找不到語言參考。

更好:

function SimpleSymbols(str) { 
    var abc = 'abcdefghijklmnopqrstuvwxyz'; 

    for (var i = 0; i < str.length; i++) { 
     if (abc.indexOf(str[i]) !== -1) { 
      if (str[i-1] + str[i+1] != "++") { 
       return false; 
      } 
     } 
    } 
    return true; 
} 

也有可能進行(通過檢查而非通過串除了邊界字符)可能的性能提升,而且你還可以通過正則表達式做到這一點。

通過正則表達式:

if (str.search(/[^+][a-z]/) >= 0)  // will match letters with no + beforehand. 
    return false; 
if (str.search(/[a-z][^+]/) >= 0)  // will match letters with no + afterward. 
    return false; 
return true; 
+0

感謝您修復我的錯誤代碼以及性能改進方面的建議。從性能角度來看,字符串連接通常是不好的? – Everes83

+0

不客氣!通常,字符串連接不是很快..他們需要分配和複製一個可變長度的數組,這比在處理器中測試/或添加一個整數慢得多。別擔心,但如果有更簡單/更快的替代方案,那就更好。希望這可以幫助! –

0

我相信這是一個完美的正則表達式的情況下 檢查正則表達式^[^a-z]*(\++[a-z]\++[a-z]?)*[^a-z]*$解釋in here

使用它在JavaScript這樣的:

function SimpleSymbols(str) { 
    return !/^[^a-z]*(\++[a-z]\++[a-z]?)*[^a-z]*$/i.test(str); 
} 
+0

正則表達式對我來說仍然看起來像一個外星人的語言...還沒有解決它的學習。 – Everes83

+0

正如你可以從鏈接中看到的,它解釋了這個表達式的含義,你應該開始學習,因爲它會幫助你輕鬆找到任何字符串模式。 檢查http://regexpal.com/來測試你的正則表達式並檢查正則表達式Cheat sheet http://www.cheatography.com/davechild/cheat-sheets/regular-expressions/ –

1

我解釋這作爲:沒有字母不是前面/後面加上一個字符(包括沒有):

function SimpleSymbols(str) { 
    return !/^[a-z]|[^+][a-z]|[a-z][^+]|[a-z]$/i.test(str) 
} 
+0

這真棒,但我還沒有學習正則表達式! – Everes83