避免用 string.replace 替换之前的字母
Avoid replacement of previous letters with string.replace
我正在做一个 CodeWars 套路,它根据字母的重复将单词编码为左括号或右括号。这是 link.
我的代码适用于所有测试,但只有一个,当单词等于“ ( ( )”时。
我想我发现在最后一个“)”上,第一个“(”由于替换的匹配而被更改为“)”,从而改变了预期的输出。有什么方法可以防止我的输出发生这种不必要的变化吗?
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(" ( ( )")); // )))))(
我的输出
duplicateEncode(" ( ( )")); // ()))))
不要在整个单词上使用String.replace,你应该直接修改每个字符,或者更好的是构造一个新字符串到return。
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(" ( ( )"));
// )))))(
我正在做一个 CodeWars 套路,它根据字母的重复将单词编码为左括号或右括号。这是 link.
我的代码适用于所有测试,但只有一个,当单词等于“ ( ( )”时。
我想我发现在最后一个“)”上,第一个“(”由于替换的匹配而被更改为“)”,从而改变了预期的输出。有什么方法可以防止我的输出发生这种不必要的变化吗?
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(" ( ( )")); // )))))(
我的输出
duplicateEncode(" ( ( )")); // ()))))
不要在整个单词上使用String.replace,你应该直接修改每个字符,或者更好的是构造一个新字符串到return。
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(" ( ( )"));
// )))))(