特定情况下的字符串压缩

String Compression with a particular case

例子是

let string1 = "AAAAA"
Output: 4A1A
My output: 4A

let string2 = "AAAAAAAAABBBBBCCCCDD"
output : 4A4A1A4B1B4C2D
My output: 4A4A4B2B4C2D

如果特定字符的长度大于 4,则重新从 1 开始计数。

我每次都无法打印剩余的一个字符。请参考上面的例子:

这是我的代码。请尽量改进我的代码,不要给出新的解决方案。

function stringCompress(str) {
  let sum = 0;
  let res = "" 
  let demo = []
  for(let i = 0; i < str.length;i++){
      demo.push(i+"=" +str.substring(i,i+1))
      if(str.substring(i,i+1) != str.substring(i+1,i+2) || sum == 4 ){
          sum = sum+1
          let temp = 0;
          if(sum > 4){
              sum = 4
              temp = 1
          }
          res += sum+str.substring(i,i+1);   
          
          if(temp == 1){
              sum = temp
          }else{
            sum = 0;  
          }
          
          
      }
      else{
          sum = sum +1
      }
      
  }
   
  return res
}

let d = "AAAAAAAAABBBBBCCCCDD"

console.log(stringCompress(d))

让我们简化一下。将字符串拆分为最多 4 个相等字符的块数组,随后使用 Array.map 添加每个块的长度并连接结果。

console.log(compress("AAAAA"));
console.log(compress("AAAAAAAAABBBBBCCCCDD"));

function compress(str) {
  let strings = [];
  let chunk = '';
  for (let i = 0; i < str.length; i += 1) {
    // if [chunk] contains a character and its length is not 4 and 
    // its first character equals the current character add 
    // the current character to [chunk]
    if (chunk.length > 0 && chunk.length < 4 && str[i] === chunk[0]) {
      chunk += str[i];
    } else {
      // if [chunk] is not "", push it to [strings]
      chunk.length && strings.push(chunk);
      // reassign [chunk] using the current value
      chunk = str[i];
    }
  }
  // chunk may not be empty yet
  if (chunk.length) {
    strings.push(chunk);
  }
  // convert to string
  return strings.map(v => `${v.length}${v[0]}`).join("")
}

如果你添加

if (sum > 0) {
  const last = str.slice(-sum);
  res += last.length + last;
}

在您的代码循环之后(因此,就在 return ... 之前),您的代码将按预期工作。