алгоритм сжатия строки - PullRequest
0 голосов
/ 07 ноября 2018

Я хочу написать функцию для сжатия символов строки, такую ​​как 'bbbab', которая будет преобразована в 'b3ab', и я застреваю

это только печать "b3"

вот код пока

let string = 'bbbab';
let letters = string.split("");
let currentAlphabetLetter = letters[0];
let count = 0;
let newString = [];

string.split("").forEach(letter => {
    if (letter === currentAlphabetLetter) {
        count++;
    } else {
        if (count > 0) {
            newString.push(`${currentAlphabetLetter}${count}`);
        } else {
        newString.push(`${letter}`);
    }
    count = 0;
    currentAlphabetLetter = letter;
  }
})


console.log(newString);

Ответы [ 4 ]

0 голосов
/ 13 ноября 2018

groupCharacters добавляет пробел между каждым набором уникальных значений и разбивает его на массив

compressCharacters отображает каждый элемент в массиве с числовым значением, если его длина больше единицы

const str = 'bbbab';

const groupCharacters = str => [...str].reduce((accumulator, element, index) => accumulator + element + (str[index + 1] !== undefined ? element === str[index + 1] ? '' : ' ' : '')).split(" ");

const compressCharacters = arr => arr.map(e => e[0] + (e.length > 1 ? e.length : '')).join("")

compressCharacters(groupCharacters(str));
0 голосов
/ 07 ноября 2018

Как это должно работать для вас

let string = 'bbbab';
let newString = [];

if (string.length < 2) { console.log(string); }
else {
    let letters = string.split("");
    let prev = letters[0];
    let count = 1;
    for( var i = 1; i < letters.length; i++) {
      if (letters[i] !== prev) {
        count > 1 ? newString.push(`${prev}${count}`) : newString.push(`${prev}`);
        count = 1;
      } else {
        count++;
      }
      prev = letters[i];
    }
    /* last element push */
    count > 1 ? newString.push(`${prev}${count}`) : newString.push(`${prev}`);
    console.log(newString.join(""));
}
0 голосов
/ 09 ноября 2018

Вы можете сделать следующее;

var str = 'bbbabccc',
    res = [...str].reduce((r,c,i) => (r[r.length-1][0] === c || !i) ? (r[r.length-1] += c, r)
                                                                    : r.concat(c), [""])
                  .reduce((r,s) => r + s[0] + (s.length-1 ? s.length : ""), "");
console.log(res);

У нас есть два .reduce() каскадных здесь, но сначала приятно знать, что [...str] превращается в ["b", "b", "b", "a", "b", "c", "c", "c"].

Первый .reduce() уменьшит его до массива строк, таких как ["bbb", "a", "b", "ccc"].

Второй .reduce() еще больше уменьшит его до результата. Внутреннюю механику каждого редуктора решать вам.

Однако, как подсказка, имейте в виду, что оператор запятой ,, как в (r[r.length-1] += c, r), берет последний элемент массива r (здесь аккумулятор), добавляет c к его концу и возвращает r .

0 голосов
/ 07 ноября 2018

Когда вы начинаете новую букву, вам нужно установить count на 1, в противном случае вы не учитываете первое вхождение символа.

Это не проблема в самом начале строки, потому что вы обрабатываете первую букву дважды: вы извлекаете ее с помощью let currentAlphabetLetter = letters[0];, а затем снова обрабатываете ее на первой итерации forEach. Чтобы сделать начало строки таким же, как и в других вхождениях, вы должны перебрать подстроку, начиная со второго символа.

И вместо того, чтобы нажимать на массив, вы должны добавить строку.

Когда count равен 1, вам нужно добавить currentAlphabetLetter, а не letter.

let string = 'bbbab';
let letters = string.split("");
let currentAlphabetLetter = letters[0];
let count = 1;
let newString = "";

string.substr(1).split("").forEach(letter => {
  if (letter === currentAlphabetLetter) {
    count++;
  } else {
    if (count > 1) {
      newString += `${currentAlphabetLetter}${count}`;
    } else {
      newString += `${currentAlphabetLetter}`;
    }
    count = 1;
    currentAlphabetLetter = letter;
  }
});

// Process the last letter
if (count > 1) {
  newString += `${currentAlphabetLetter}${count}`;
} else {
  newString += `${currentAlphabetLetter}`;
}

console.log(newString);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...