#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
оператора выполняет работу