2016-09-11 4 views
0

다음 알고리즘 문제에 대한 코드를 작성하고 작동하지 않는 이유를 알지 못합니다. 디버거 다음에, 나는 elem 변수가 's'를 반복하지 않는다는 것을 발견했다. 부모님을 위해 for 루프를 깨는 방법을 이해했기 때문에 이것이 가능할 수 있다고 우려했습니다. 나는 이 질문을 읽었다 : Best way to break from nested loops in Javascript? 그러나 나는 아마 내가 뭔가 잘못하고 있는지 확실하지 않다. 카운터 i 결코 증가하지 않기 때문에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

내가 제대로 루프를 깨는 생각, 함수가 항상 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

내 제안은 두 개의 루프를 사용하는 대신 single 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. 
관련 문제