2014-04-11 2 views
0

주어진 문자열에서 x와 o의 발생을 계산하고 함수가 같으면 true를 반환하는 함수를 만들었습니다. 문자열에서 문자의 발생을 계산합니다.

function ExOh(str) { 
    var x_count = 0; 
    var o_count = 0; 

    for (var i = 0;i < str.length-1;i++){ 
    if (str[i] === 'x'){ 
     x_count = x_count + 1; 
    } 
    else if (str[i] === 'o'){ 
     o_count = o_count + 1; 
    } 
    } 

    console.log(o_count); 
    console.log(x_count); 
    if (x_count === o_count){ 
    return true;} 
    else{ 
    return false; 
    } 

} 
// keep this function call here 
// to see how to enter arguments in JavaScript scroll down 
ExOh(readline()); 

나는 제대로 계산되었는지 확인하려면 코드

console.log(o_count); 
    console.log(x_count); 

의 라인을 추가하고 그 문제였다 발견했다. 테스트 한 후에이 함수는 문자열의 마지막 요소를 테스트하지 않는다는 것을 알게되었습니다. for 루프의 길이를 변경해 보았지만 그 밖의 무엇이 잘못 될 수 있는지 생각할 수 없습니다.

어떤 조언이 필요합니까?

감사의 말

+1

'내가 Apolo

+1

을 <또는 단지 오의 최종 X 년대와 oStr과에 xstr을 만들기 위해 정규식을 사용합니다. 그런 다음 o.length와 x.length –

답변

3

JavaScript 배열은 인덱스 기반 개체 0 개입니다. 따라서 루프는 다음과 같아야합니다.

for (var i = 0; i < str.length; i++) { 

그렇지 않으면 마지막 요소를 건너 뜁니다.

문자열의 길이가 5 인 것으로 간주하십시오. 그래서, 당신은 다음과 같은 원래의 상태

for (var i = 0; i < str.length - 1; i++) { 

했다 i 0에서 시작하는 경우

0 < 4 
1 < 4 
2 < 4 
3 < 4 
4 < 4 -- Fails 

은 그래서 루프에서 중단 루프에서 일어나는 비교입니다. 그러나 마지막 요소는 인덱스 (4)에있을 것입니다하지만 당신이

for (var i = 0; i < str.length; i++) { 

같은 조건이 때 비교 그것은 단지 모든 요소를 ​​비교 한 후 루프에서 중단이

0 < 5 
1 < 5 
2 < 5 
3 < 5 
4 < 5 
5 < 5 -- Fails 

처럼 이동합니다.

그래서, 실제 프로그램은 루프 너무 짧은 하나의 실행이

function ExOh(str) { 
    var x_count = 0, o_count = 0; 

    for (var i = 0; i < str.length; i++) { 
     if (str[i] === 'x') { 
      x_count = x_count + 1; 
     } else if (str[i] === 'o') { 
      o_count = o_count + 1; 
     } 
    } 

    return x_count === o_count; 
} 
0

처럼 쓸 수 있습니다. 대신이 방법을 사용해보십시오.

for (var i = 0;i < str.length;i++){ 
    if (str[i] === 'x'){ 
     x_count = x_count + 1; 
    } 
    else if (str[i] === 'o'){ 
     o_count = o_count + 1; 
    } 
    } 
+1

을 "너무 길지 않음"과 비교하십시오. 실제로 충분히 길지는 않습니다. –

0

다른 방법이 카운트 문자 : 오히려 for으로 전체 문자열을 통해 루핑보다 indexOf를 사용하는 것은 빠른 결과를 달성 할 경우

var s = 'example'; 
s.split('').filter(function (i) { return i === 'e'; }).length; // 2 
+1

이렇게하면, 왜's.split ('e'). length - 1'이 아니겠습니까? –

+0

은 단순하기 때문에 +1했습니다. – phylax

0

, 내가 볼 것

function countOccurance(haystack, needle) { 
    var total = 0, pos = -1; 
    while (-1 !== (pos = haystack.indexOf(needle, pos + 1))) 
     total += 1; 
    return total; 
} 

그 다음

var x_count = countOccurance(str, 'x'), 
    o_count = countOccurance(str, 'o'); 

return x_count === o_count; 

EDIT 내가 더 빠르다는 것은 잘못된 것처럼 보입니다!다른 두 needle 어떠한 문자열와 함께 작동해야하는 반면 그 중요한 경우 jsperf

function indexOfMethod(haystack, needle) { 
    var total = 0, pos = -1; 
    while (-1 !== (pos = haystack.indexOf(needle, pos + 1))) 
     total += 1; 
    return total; 
} 
function splitMethod(haystack, needle) { 
    return haystack.split(needle).length - 1; 
} 
function forMethod(haystack, needle) { 
    var total = 0, i; 
    for (i = 0; i < haystack.length; ++i) 
     if (haystack.charAt(i) === needle) 
      total += 1; 
    return total; 
} 

forMethod 만, 문자needle 작동합니다.

+0

아. 왜'if (someBoolean) {return true; } return false;','return (something)'이 충분할 때? – raina77ow

+0

@ raina77ow 예, 복사하고 충분히 단순화하지 않았고 편집했습니다. –

0

귀하의 문제는 for 루프에 있습니다. 이것으로 변경해보십시오.

for (var i = 0; i < str.length; i++) { 

당신은 루프를 사용하지 않도록하려면

, 당신은 ExOh 기능이 훨씬 짧은 버전을 사용할 수 있습니다. 조건에 대한

function ExOh(str) { 
    return str.match(/o/g).length == str.match(/x/g).length 
} 
관련 문제