避免用 string.replace 替换以前的字母

问题描述

我正在做一个 CodeWars kata,它根据字母的重复将单词编码为左括号或右括号。这是link

我的代码适用于除一个之外的所有测试,当单词等于“( ( )”时。

我想我发现在最后一个“)”上,第一个“(”由于替换匹配而被更改为“)”,从而改变了预期的输出。有什么办法可以防止我的输出发生这种不必要的变化?

View view =getSupportActionBar().getCustomView(); ImageButton imageButton =
 (ImageButton)view.findViewById(R.id.action_bar_back); imageButton.setOnClickListener( new View.OnClickListener() {
@Override
public void onClick(View v){ 
   // Your code here ...
  } 
});

预期输出

const duplicateEncode = (word) => {
  let words = word.toLowerCase();
  let obj = {};
  for (let i of words) {
    obj[i] = obj[i] ? obj[i] + 1 : 1;
  }
  for (let i of words) {
    obj[i] === 1
      ? (words = words.replace(i,"("))
      : (words = words.replace(i,")"));
  }
  return words;
};

我的输出

duplicateEncode(" ( ( )")); // )))))(

解决方法

不要在整个单词上使用 String.replace,你应该直接修改每个字符,或者最好只构造一个新的字符串来返回。

const duplicateEncode = (word) => {
  let words = word.toLowerCase();
  let obj = {};
  for (let i of words) {
    obj[i] = obj[i] ? obj[i] + 1 : 1;
  }
  let out = "";
  for (let i of words) {
    out += obj[i] === 1 ? "(" : ")";
  }
  return out;
};

console.log(duplicateEncode(" ( ( )"));
// )))))(

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...