【问题标题】:Uncompress a String, repeat chars `n` times解压缩字符串,重复字符`n`次
【发布时间】:2022-01-20 18:51:28
【问题描述】:

我有以下问题陈述:

编写一个函数,解压缩,它接受一个字符串作为参数。 输入字符串将根据以下格式格式化为多个组 以下模式:

数字 + 字符

例如,“2c”或“3a”。

该函数应返回未压缩版本的字符串,其中 组中的每个 'char' 连续重复 'number' 次。你 可以假设输入字符串根据 前面提到的模式。

test_00: uncompress("2c3a1t"); // -> 'ccaaat'

这是我使用堆栈的代码。问题是它只返回'cc',我不知道为什么。我已经在控制台记录了进入 IF ELSE 的内容,并且我同时击中了两者,所以我不明白为什么没有任何东西被推入堆栈。

如果有人能发现我遗漏的东西,我将不胜感激。

const uncompress = (s) => { 
  const nums = '23456789';
  const stack = []; 
  for (let char of s) {
    if (nums.includes(char)) {
      stack.push(Number(char));
    } else {
      const num = stack.pop();
      stack.push(char.repeat(num));
    };
  };
  return stack.join('');
};

console.log(uncompress("2c3a1t")); // -> 'ccaaat'

【问题讨论】:

  • 我添加了一个 sn-p;如果您可以添加显示输入和预期输出的示例以及函数输出的内容,那将会很有帮助。例如,console.log(uncompress('2c3a1t')); // 'ccaaat'.
  • 感谢您的反馈!我刚刚修改了问题。
  • 您的代码应该没问题,您只是在您的nums 中缺少1

标签: javascript arrays string


【解决方案1】:

我会这样做:

将字符串拆分成数字和字符对:

str.match(/\d+[a-zA-Z]/g)

然后将该数组简化为一个字符串,同时从数组中获取每个值,从中获取字符 (cv.match(/[a-zA-Z]/)[0]) 并根据数字重复它 (.repeat(parseInt(cv)))

const uncompress = str => str.match(/\d+[a-zA-Z]/g).reduce((acc, cv) =>
  acc + cv.match(/[a-zA-Z]/)[0].repeat(parseInt(cv)), "")

console.log(uncompress("2c3a1t"))
console.log(uncompress("27b1d8g"))

【讨论】:

  • 我喜欢正则表达式的答案。有什么正则表达式不能解决的吗?
  • @Trevor X/HTML 是一个很大的问题,嗯,还有其他处理非常规语言的问题:P (stackoverflow.com/a/1732454/6634591)
  • 当您需要正则表达式非拉丁语言时会发生什么?
  • 这让我流泪了。你的正则表达式专家是一个切入点。
【解决方案2】:

就像这样,我能够编写通过测试用例的代码:

  const nums = '123456789';
  const stack = []; 
  for (let char of s) { 
    if (nums.includes(char)) {
      stack.push(Number(char));
    } else {
      let num = '';
      while (nums.includes(stack[stack.length - 1])) {
        num += stack.pop(); 
      }
      stack.push(char.repeat(num));
    };
  };
  return stack.join('');
};

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-27
    • 2011-11-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多