2016-09-11 13 views
0

次のアルゴリズム上の問題のコードを記述し、それがなぜ機能しないのかわかりません。デバッガに続いて、私はelem変数が 's'を越えることはありません。私は、親のループから抜け出す方法を私が理解しているためにこれが起こりうると懸念しています。私は この質問を読む:Best way to break from nested loops in Javascript?しかし、おそらく私は何か間違っているかどうかはわかりません。JSネストされたforループの中断

function firstNonRepeatingLetter(s) { 
    //input string 
    //return first character that doesn't repeat anywhere else. 
    //parent for loop points to the char we are analyzing 
    //child for loop iterates over the remainder of the string 
    //if child for loop doesnt find a repeat, return the char, else break out of the child for loop and cont 

if (s.length == 1) { return s;} 

    parent_loop: 
    for (var i = 0; i < s.length - 1; i++){ //parent loop 
     var elem = s[i]; 
     child_loop: 
     for (var j = i + 1; j < s.length; j++){ 
      if (elem == s[j]){ 
      break child_loop; 
      } 
     } 
    return s[i]; 
    } 
return ""; 
} 

console.log(firstNonRepeatingLetter('stress')); // should output t, getting s. 

答えて

0

私はあなたが正しくループを壊しているカウンタiがインクリメントないため、関数は常にsを返す理由があると思います。

はのは、あなたが子供のループから抜け出すコードを

i = 0, element = 's', j = 1, s[j] = 't', which is not equal to 's' 
j++, j = 2, s[j] = 'r', not equal to 's' 
j++, j = 3, s[j] = 'e', not equal to 's' 
j++, j = 4, s[j] = 's', equal to 's' 

を実行してみましょう。

今度はi = 0となるとreturn s[i]という行が表示されるので、当然この関数はsを返します。

は、あなたはとても

if(j == s.length) { 
    return s[i]; 
} 

機能は今 'T' を返すように、if文を含めることreturn s[i]を変更した場合。子ループが完全に完了したかどうかをチェックしています。つまり、break child_loop;が実行されたことはなく、一意の文字があります。

1

2つのループを使用する代わりに、forループを使用することをお勧めします。

for(var i = 0; i<s.length - 1;i++) { 
    var lastIndex = s.lastIndexOf(s[i]); 
    if (lastIndex == i) { 
     return s[i]; 
    } 
} 
1

これで試してみてください。

これは

if(f!=true) 
return s[i]; 

は完全なコード

function firstNonRepeatingLetter(s) { 
    //input string 
    //return first character that doesn't repeat anywhere else. 
    //parent for loop points to the char we are analyzing 
    //child for loop iterates over the remainder of the string 
    //if child for loop doesnt find a repeat, return the char, else break out of the child for loop and cont 

if (s.length == 1) { return s;} 


    for (var i = 0; i < s.length - 1; i++){ //parent loop 
     var elem = s[i]; 

    var f=false; 
     for (var j = i + 1; j < s.length; j++){ 

      if (elem == s[j]){ 

      f=true; 
      break; 
      } 

     } 

    if(f!=true) 
    return s[i]; 
    } 

return ""; 
} 

console.log(firstNonRepeatingLetter('stress')); // should output t, getting s. 
を参照してください私のコードの鍵となりました
関連する問題