2016-03-26 39 views
0

所以輸入是按字母順序排列的字母串。在那裏的某個地方,一封信失蹤了。我必須寄回丟失的信件。我已經在下面發佈了我的代碼。這是很好的評論,這些評論解釋比我能在這裏更好。我會在下面解釋我的問題。在字符串中查找丟失的字母Javascript

function fearNotLetter(str) { 
    var charCodes; 
    var test; 
    var offendingNumber; 
    var numToString; 

    // i starts at 1, increments to str.length 
    for (var i = 1; i < str.length; i++) { 
    // Char code of last letter minus char code of second last letter, 
    // Char code of second last letter minus char code of third last letter, etc. 
    // Repeat on a loop and set result equal to test each time. 
    test = str.charCodeAt(str.length - [i]) - str.charCodeAt(str.length - [i + 1]); 
    console.log(test); 

    // If charCode A - charCode B == 1, then letters are in order 
    // alphabetically and test returns 1. 

    // If charCode A - charCode B > 1, then letters missing from string. 

    // So if difference between char codes is more than 1, 
    // return missing char code and convert to string. 
    if (test > 1) { 
     offendingNumber = str.charCodeAt(str.length - [i]); 
     numToString = String.fromCharCode(offendingNumber); 
     console.log(numToString); 
    } // End of if. 
    // If no letters missing from input, return undefined. 
    else { 
     return undefined; 
    } // End of else. 
    } // End of loop. 
} // End of function. 

// Here is the input str 
fearNotLetter("abce"); 

問題出在這裏。如果我輸入「abce」,我缺少d。 console.log(測試)返回2,我可以得到丟失的信件。大。

如果我輸入「abcef」(與以前相同的字符串加上f結尾),我仍然缺少d。測試返回1,好像說沒有字母丟失,但d仍然丟失。

我的程序只有在缺少的字符適合字符串中的第二個空格時才起作用。 「lmnp」有效,但「lmnpqrs」不起作用。

我的循環清楚地遍歷字符串中的每個字符,因爲它可以從長字符串「abcdefghijklmnopqrstuvxyz」中挑選缺少的w。當缺少字符後有多個字符時,爲什麼我的循環會崩潰?它的行爲就好像我在循環之外調用了console.log(test),並且只返回最後一次迭代。我試過把測試推向一個數組,但這並沒有幫助。

+0

請正確縮進您的代碼以使其可讀。 – jfriend00

+0

Amanuel Bogal編輯它。希望這是更好閱讀 – PencilCrate

+0

@maraca「abcde」str.length = 5但str.charCodeAt從[0]到[4] – PencilCrate

回答

2

有幾個問題:你索引混合起來(即關閉的情況的一個);您的退貨undefined應該在循環之外,而不是在循環之內;你在你不應該使用的地方使用str.length;你把迭代變量放在括號中時,你不應該:

function fearNotLetter(str) { 
    var difference; 
    var missingCharCode; 

    // i starts at 1, increments to str.length 
    for (var i = 1; i < str.length; i++) { 

     // Char code of last letter minus char code of second last letter, 
     // Char code of second last letter minus char code of third last letter, etc. 
     // Repeat on a loop and set result equal to test each time. 
     difference = str.charCodeAt(i) - str.charCodeAt(i - 1); 

     // If charCode A - charCode B == 1, then letters are in order 
     // alphabetically and test returns 1. 

     // If charCode A - charCode B > 1, then letters missing from string. 

     // So if difference between char codes is more than 1, 
     // return missing char code and convert to string. 
     if (difference > 1) { 
      missingCharCode = str.charCodeAt(i) - 1; 
      return String.fromCharCode(missingCharCode); 
     } // End of if. 
    } // End of loop. 

    return undefined; 
} // End of function. 
+0

我讓它變得不必要的複雜。此解決方案有效。謝謝。 – PencilCrate

+0

如果函數的行爲在函數上面的塊中解釋過,代碼將會更清晰。在這種形式中有這麼多的內嵌評論幾乎是不可讀的。像'//我從1開始,增加到str.length'這樣的註釋非常明顯,僅僅是重複。 – Hal50000

0

你的循環中斷,因爲你正在返回從功能回來,如果test不大於1

0

這裏是我採取的是:在這兩種情況下

function fearNotLetter(str) { 
    var ch0 = str.charCodeAt(0), ch; 
    str.split("").every(function(v, i){ 
    ch = String.fromCharCode(ch0 + i); 
    return ch === v; 
    }); 
    return ch === str[str.length-1] ? undefined : ch; 
} 


console.log(fearNotLetter("cdefgij")); // "h" 
+0

Ooof。這是一款CrockPunch(TM) – Hal50000

1
/* 
* Returns the first non alphabetic character in the input string. If 
* all characters are in alphabetic order function returns null. 
*/ 
function findFirstNonAlphabeticCharIn(input) { 

    for (var i = 1; i < input.length; i++) { 

     var range = input.charCodeAt(i) - input.charCodeAt(i - 1); 
     if (range != 1) return input.charAt(i);  
    } 
    return null; 
} 

注意函數返回一個值。