Как уменьшить размер строки, используя предыдущие числа?

#javascript

#javascript

Вопрос:

Как уменьшить размер строки, например replace "CCCC" to "4C" .

Если есть один буквенный сегмент, он остается неизменным; "ABBBCCDCC" to "A3B2CD2C" .

Комментарии:

1. Это звучит как домашнее задание. Вы уже написали какой-нибудь код? Каков ваш подход? С какой проблемой вы сталкиваетесь при реализации этого?

Ответ №1:

Вы можете использовать аргумент обратного вызова String#replace и регулярное выражение с обратной ссылкой ( 1 ):

 let s = "ABBBCCDCC";
let res = s.replace(/(.)1 /g, m => m.length   m[0]);

console.log(res);  

В случае, если вам нужно решение без регулярных выражений, использующее только самый простой JavaScript, вы могли бы использовать следующий код, который просто реализует то, что вы сделали бы с карандашом и бумагой:

 let s = "ABBBCCDCC";
let res = "";
for (let i = 0; i < s.length; i  ) {
    let chr = s[i];
    let count = 1;
    while (i < s.length amp;amp; s[i 1] == chr) {
        i  ;
        count  ;
    }
    if (count > 1) res  = count;
    res  = chr;
}

console.log(res);  

Комментарии:

1. это правильно, но это должно быть m.length m[0] вместо m[0] m.length, чтобы соответствовать тому, что требуется в вопросе.

2. Я думаю, вам нужно изменить порядок; ваш показывает B3 , а не 3B . Легко исправить. И умное решение.

3. Порядок изменен ,-)

Ответ №2:

 function getTransformText(element){
    let text = element.value;
    let lastMatchedChar = ''; // This help us know the last 'char' that was matched
    let result =  (text.split('').map((c, i)=>
    {
        let cCount = 0; 
        if(c !== lastMatchedChar)
            lastMatchedChar = c;
        else
            return '';
            
        let nonMatch = false;
        
        text.split('').forEach((c_1, i_1)=>
        {
          if(i <= i_1)
          {
            if(lastMatchedChar === c_1 amp;amp; !nonMatch )
            {
                lastMatchedIndex = i_1;
                  cCount
            } else {
                nonMatch = true;
            }
          }
        });
        
        return ''.concat(cCount,lastMatchedChar); 
    }));
    
    document.getElementById('out').innerHTML = result.join('');
    
    return result.join('');
}  
 <input placeholder="Enter your string" onkeyup="return getTransformText(this)" id="in" />

<div>
Answer is: <span id="out"></span>
</div>  

Ответ №3:

 function decreaseSize(example) {
    example = example.toUpperCase();
    newString = [1, example[0]]
    for (i = 1; i < example.length; i  ) {
        if (example[i] === newString[newString.length - 1]) {
            if (typeof newString[newString.length - 2] === "number") {
                newString[newString.length - 2]  ;
            } else if (typeof newString[newString.length - 2] === "string") {
                newString[newString.length - 1] = 2;
                newString.push(example[i]);
            }
        } else {
            newString.push(example[i])
        }
    }
    newString.shift();
    return newString.join("")
}
  

Редактировать:

 function decreaseSize(example) {
    example = example.toUpperCase();
    newString = [1, example[0]]
    for (i = 1; i < example.length; i  ) {
        if (example[i] === newString[newString.length - 1]) {
            if (typeof newString[newString.length - 2] === "number") {
                newString[newString.length - 2]  ;
            } else if (typeof newString[newString.length - 2] === "string") {
                newString[newString.length - 1] = 2;
                newString.push(example[i]);
            }
        } else {
            newString.push(example[i])
        }
    }
    if (newString[0] === 1) {
        newString.shift();
    }
    return newString.join("")
}
  

Комментарии:

1. Это не выводит правильный результат. т.е. AASSSSDDDDEEECC выводит `A4S4D3E2C`

2. о да, первый символ сдвигается, поэтому 2 был удален, добавление простого if оператора выполняет работу