1

coderbyte.com から次の問題を解決しようとしています。

JavaScript 言語を使用して、関数 SimpleSymbols(str) に渡された str パラメーターを取得させ、文字列 true または false を返すことによって、それが受け入れ可能なシーケンスであるかどうかを判断します。str パラメーターは + 記号と = 記号で構成され、その間に複数の文字が含まれます (つまり、++d+===+c++==a)。文字列が true であるためには、各文字が + 記号で囲まれている必要があります。したがって、左側の文字列は false になります。文字列は空ではなく、少なくとも 1 つの文字が含まれます。

以下は私の試みです:

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 を返す必要があります。

注意: 文字列は小文字になると想定しています...大文字と小文字の区別については扱っていませんが、小文字バージョンを機能させたいので、大文字と小文字を区別しないようにします。

私のコードの何が問題なのかについてのアイデアはありますか?

4

5 に答える 5

0

これは、+ 記号で囲まれた最初の成功した文字に対して「true」を返し、最後までチェックを続けません。

また、最初/最後の文字で、文字列インデックスが out-of-bounds になるかどうかも疑問に思います[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;
}

おそらくパフォーマンスの改善もあり (文字列の追加ではなく AND によって境界文字をチェックする)、正規表現によって行うこともできます。

正規表現による:

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;
于 2013-10-01T04:42:56.120 に答える
0

これは完璧な正規表現のケースだと思いますここで^[^a-z]*(\++[a-z]\++[a-z]?)*[^a-z]*$説明されている正規表現を確認してください

次のように JavaScript で使用します。

function SimpleSymbols(str) { 
   return !/^[^a-z]*(\++[a-z]\++[a-z]?)*[^a-z]*$/i.test(str);
}
于 2013-10-01T04:55:45.120 に答える