2013-06-11 2 views
0

이 문자열 압축 문제를 해결 할 수 없습니다 :나는 내가 이런 식으로 문자열을 압축해야하는 상황이

"AAABBBCCCDDD" => "A3B3C3D3", or 
"ABBCCCDDDDEEEEE" => "A1B2C3D4E5", or 
"FOOFOO" => "F1O2F1O2", this one is the one I can't solve 

내가 자바 스크립트와 함께이 일을하고 지금까지 나는이 함께했다 한을 :

function in_array(key, array) { 
    for(var x in array) { 
     if(array[x] == key) { 
      return true; 
     } 
    } 

    return false; 
} 

function compress(str) { 
    var str_splitted = str.split(''); 
    var new_strings = []; 

    for(var x in str_splitted) { 
     if(!in_array(str_splitted[x], new_strings)) { 
      new_strings.push(str_splitted[x]); 
      new_strings.push((str.split(str_splitted[x]).length - 1)); 
     } 
    } 

    return new_strings.join(''); 
} 

그래서, 코드 내 조각으로 두 가지 예는 완벽하게 작동하지만 세번째는 일치하는 모든 문자를 계산 nontheless 것이다 출력 그래서 :

"FOOFOO" => "F2O3", and not "F1O2F1O2" 

이 문제에 대한 도움, 조언, 조언 및/또는 더 나은 해결책이 정말로 필요합니다. 그리고 저에게 많은 도움을 주신 모든 분들께 감사드립니다!

+0

당신은 그들이 행에있는 검사, 각 문자의 총 발생을 계산하지 않고 있습니다. – Barmar

+0

@Barmar - 예 내 친구, 나는 그것을 알고 있습니다 ... 나는 그것을 성취하기위한 논리를 찾을 수 없습니다. 나 좀 도와 줄 수있어? –

답변

1

루프 문자열을 통해 이전 문자 비교 :

function compress(str) { 
    var last = null, cnt = 0, result = ''; 
    for (var i = 0; i < str.length; i++) { 
     var c = str.charAt(i); 
     if (last != c) { 
      if (last != null) { 
       result += last + cnt; 
      } 
      last = c; 
      cnt = 0; 
     } 
     cnt++; 
    } 
    if (cnt > 0) { 
     result += last + cnt; 
    } 
    return result; 
} 

데모 : http://jsfiddle.net/pjb5F/

주 : 인덱스 액세스 문자열에 괄호를 사용하여 사용하기 때문에, IE의 이전 버전에서 작동하지 않습니다 charAt.

+0

남자 ... 당신과 Barmar는 거의 정확한 예를 썼습니다! –

+0

@ZlatanO : 제외하고 제 작품. ;) – Guffa

1
function compress(str) { 
    var result = '', 
     last = null, 
     count = 0; 
    for (var i = 0; i < str.length; i++) { 
     var cur = str.substr(i, 1); 
     if (cur !== last || count == 9) { 
      if (last !== null) { 
       result += last + count; 
      } 
      last = cur; 
      count = 0; 
     } 
     count++; 
    } 
    // Append the last character 
    if (last !== null) { 
     result += last + count; 
    } 
    return result; 
} 
+1

compress ("FOOFOO") ==> "F0O0F0O0". 카운터를 늘리는 것을 잊었습니다. 첫 시운전에서 같은 오류가 발생했습니다. :) – Guffa

+0

감사. 이 문제를 해결하고 카운트가 9에 도달하는지에 대한 체크를 추가했습니다.이 압축 구문은 두 자리 길이를 처리 할 수 ​​없습니다. – Barmar

+0

음 ... 숫자가있는 문자열을 압축 할 필요가 없다면 문제가되지 않습니다. – Guffa

1
function compress(str){ 
    var result = '', 
     current = '', 
     count = 0; 
    for(var i = 0; i <= str.length; i++) 
     if(i < str.length){ 
      if(str[i] !== current){ 
       if(current){ 
        result += current + count.toString(); 
        count = 0; 
       } 
       current = str[i]; 
      } 
      count++; 
     } else 
      result += current + count.toString(); 
    return result; 
} 
관련 문제