2013-08-19 76 views
1

做一個CoderByte挑戰:爲什麼不.toUpperCase()大寫str [i]?

使用JavaScript語言,具備的功能LetterChanges(STR) 採取傳遞str參數,並使用以下 算法進行修改。將字符串中的每個字母替換爲字母后的字母 (即c變成d,z變成a)。然後 用這個新字符串(a,e,i,o,u)中的每個元音大寫,最後 返回這個修改過的字符串。

我的解決方案:

function LetterChanges(str) { 
    var alphabet = "abcdefghijklmnopqrstuvwxyza", 
     vowels = "aiueo", 
     newstr = ''; 

    for (var i = 0; i < str.length; i++) { 
     if (alphabet.indexOf(str[i]) != -1) { 
      newstr += alphabet[alphabet.indexOf(str[i]) + 1]; 
     } else { 
      newstr += str[i]; 
     } 
    } 


    for (var i = 0; i < vowels.length; i++) { 
     for (var j = 0; j < newstr.length; j++) { 
      //toUppercase the vowel in the newstring once found 
      if (newstr[j] == vowels[i]) { 
       newstr[j] = newstr[j].toUpperCase(); 
      } 
     } 
    } 
    return newstr; 
} 

show(LetterChanges("fun times")); 
show(LetterChanges("hello*3")); 

toUpperCase()不利用我想要的元音。這似乎是正確的。我甚至已經試過這樣的事情:

if (newstr[j] == vowels[i]) { 
    var toCap = newstr[j].toString(); 
    newstr[j] = toCap.toUpperCase(); 
} 

如果你想更好的解決方案,那麼請回答toUpperCase()部分,然後推薦另一種解決方案。

+4

對於元音大寫部分,您可以使用正則表達式並在字符串上調用'newstr = newstr.replace()',如'.replace(/ [aeiou] +/g,function(match){返回match.toUpperCase(); });' – Ian

+0

@你應該提供這個答案,因爲它解決了這個問題。 –

+0

這似乎是挑戰性的文字是故意設置用戶的失敗。 – Esailija

回答

0

字符串的內容不能改變,I.E.它們是不可變的。創建一個新字符串,而不是嘗試就地編輯一個字符串。

+0

我可以將新的字母添加到數組。更改數組中的項目。然後將它們連接成一個字符串? – Patrick

+0

@帕特里克:是的;這是最好的方法。 – SLaks

+0

這真的和這個問題沒有任何關係。 @Patrick正在用'toUpperCase'方法返回的字符串替換數組的元素,所以數組應該保存對字符串的新引用。 – Justin

2

Javascript中的字符串是原始類型,而不是對象。

當您在原始類型(例如,str[i] = 'a')中設置屬性時,Javascript將爲該值創建一個新的裝箱對象,並對其進行變異,然後將其丟棄。

有關更多詳細信息,請參閱spec

相反,您應該將新字符串組裝成可變數組,然後致電.join('')將其轉換爲字符串。

+0

爲什麼這是低調? – SLaks

1

您可以利用通過replace和元音的uppercasing功能:

newstr = newstr.replace(
      /[aeiou]/g,   // replace all vowels 
      function(letter) { // called for each match 
      return letter.toUpperCase(); 
      } 
     ); 

例子:http://codepen.io/paulroub/pen/tvhcF

+0

這是我第一次看到/ [aeiou]/g之類的東西。這是正確的?那將如何被讀取? – Patrick

+0

'[aeiou]':匹配括號內的任意字母。 '/ g'表示重複執行此操作;否則我們只會匹配並替換我們找到的第一個元音。 –

+0

你能推薦一個學習更多正則表達式的鏈接嗎? – Patrick

2

您可以創建另一個字符串組成返回的字符串,請在你的代碼波紋管修復

function LetterChanges(str) { 
    var alphabet = "abcdefghijklmnopqrstuvwxyza", 
     vowels = "aiueo", 
     newstr = '', 
     returnStr = ''; //added to next step 

    for (var i = 0; i < str.length; i++) { 
     if (alphabet.indexOf(str[i]) != -1) { 
      newstr += alphabet[alphabet.indexOf(str[i]) + 1]; 
     } else { 
      newstr += str[i]; 
     } 
    } 


    for (var i = 0; i < vowels.length; i++) { 
     for (var j = 0; j < newstr.length; j++) { 
      //toUppercase the vowel in the newstring once found 
      if (newstr[j] == vowels[i]) { 
       returnStr += newstr[j].toUpperCase(); 
      }else{ 
       returnStr += newstr[j]; 
      } 
     } 
    } 
    return returnStr ; 
} 
0

你可以用下面的代碼讓你的生活變得簡單

 function LetterChanges(str) { 

    return str.replace(/[a-zA-Z]/g,function(x) { 
    return String.fromCharCode(x.charCodeAt(0)+1); }).replace(/[aeiou]/g,function(y) { 
    return y.toUpperCase(); 
    }); 

    } 
相關問題