压缩字符串的算法

时间:2018-11-07 19:15:11

标签: javascript algorithm compression

我想编写一个函数来压缩字符串,例如“ 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 :(得分:1)

当您开始一个新字母时,需要将count设置为1,否则就不会计算该字符的首次出现。

这在字符串的开头就没有问题,因为您处理了第一个字母两次:用let currentAlphabetLetter = letters[0];提取它,然后在forEach的第一次迭代中再次处理它。为了使字符串的开头与其他出现的字符串相同,您应该迭代从第二个字符开始的子字符串。

您不应将其附加到数组上,而应附加到字符串上。

count1时,您需要附加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);

答案 1 :(得分:1)

您可以执行以下操作;

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

答案 2 :(得分:1)

groupCharacters在每组唯一字符之间添加一个空格,并将其拆分为一个数组

compressCharacters如果长度大于1,则用数字值映射数组中的每个元素。

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));

答案 3 :(得分:0)

就像这样对你有用

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(""));
}