重复编码器 JavaScript,尝试使用 indexOf 但输出仍然不正确
Duplicate Encoder JavaScript, try to use indexOf but the output is still incorect
将字符串转换为新字符串,如果新字符串中的每个字符在原始字符串中只出现一次,则为“(”,如果该字符出现多次,则为“)”。
找不到哪里出错了
"din" => "((("
"后退" => "()()()"
“成功”=>“)())())”
"((@" => "))(("
const duplicateEncode = (word) => {
let newString = '';
[...word.toLowerCase()].filter((e, i) => {
if (word.indexOf(e) !== i) {
newString += ')';
} else if (word.lastIndexOf(e) !== i ) {
newString += ')';
} else newString += '(';
});
return newString;
}
您的问题似乎是您在 word
上使用 .indexOf()
和 .lastIndexOf()
,其中包含大写和小写字母,但 e
将始终是输入中的小写字符,这会导致 .indexOf()
和 .lastIndexOf()
在大写时无法找到该字母。相反,将输入的小写版本存储在一个新变量中,并在调用 .indexOf()
/.lastIndexOf()
:
时使用它
const duplicateEncode = (word) => {
let newString = '';
const lowerWord = word.toLowerCase();
[...lowerWord].forEach((e, i) => {
if (lowerWord.indexOf(e) !== i) {
newString += ')';
} else if (lowerWord.lastIndexOf(e) !== i ) {
newString += ')';
} else newString += '(';
});
return newString;
}
console.log(duplicateEncode("din")); // "((("
console.log(duplicateEncode("recede")); // "()()()"
console.log(duplicateEncode("Success")); // ")())())"
console.log(duplicateEncode("(( @")); // "))(("
console.log(duplicateEncode("nGnnI)nPne@uwJ")); // ")())(()()((((("
您还应该使用 .forEach()
而不是 .filter()
,因为您没有过滤并使用 .filter()
returns.
的数组
这是另一种方法,它涉及创建一个 Map(类似于一个对象),它将每个字符的频率保存为一个值。使用 .replace()
我们可以 return 一个新字符串,我们根据每个字符是否出现多次来替换它:
const duplicateEncode = (word) => {
const lower = word.toLowerCase();
const charFreq = [...lower].reduce((map, c) => map.set(c, (map.get(c) ?? 0) + 1), new Map);
return lower.replace(/./ug, (c) => charFreq.get(c) === 1 ? "(" : ")");
}
console.log(duplicateEncode("din")); // "((("
console.log(duplicateEncode("recede")); // "()()()"
console.log(duplicateEncode("Success")); // ")())())"
console.log(duplicateEncode("(( @")); // "))(("
console.log(duplicateEncode("nGnnI)nPne@uwJ")); // ")())(()()((((("
将字符串转换为新字符串,如果新字符串中的每个字符在原始字符串中只出现一次,则为“(”,如果该字符出现多次,则为“)”。 找不到哪里出错了
"din" => "((("
"后退" => "()()()"
“成功”=>“)())())”
"((@" => "))(("
const duplicateEncode = (word) => { let newString = ''; [...word.toLowerCase()].filter((e, i) => { if (word.indexOf(e) !== i) { newString += ')'; } else if (word.lastIndexOf(e) !== i ) { newString += ')'; } else newString += '('; }); return newString; }
您的问题似乎是您在 word
上使用 .indexOf()
和 .lastIndexOf()
,其中包含大写和小写字母,但 e
将始终是输入中的小写字符,这会导致 .indexOf()
和 .lastIndexOf()
在大写时无法找到该字母。相反,将输入的小写版本存储在一个新变量中,并在调用 .indexOf()
/.lastIndexOf()
:
const duplicateEncode = (word) => {
let newString = '';
const lowerWord = word.toLowerCase();
[...lowerWord].forEach((e, i) => {
if (lowerWord.indexOf(e) !== i) {
newString += ')';
} else if (lowerWord.lastIndexOf(e) !== i ) {
newString += ')';
} else newString += '(';
});
return newString;
}
console.log(duplicateEncode("din")); // "((("
console.log(duplicateEncode("recede")); // "()()()"
console.log(duplicateEncode("Success")); // ")())())"
console.log(duplicateEncode("(( @")); // "))(("
console.log(duplicateEncode("nGnnI)nPne@uwJ")); // ")())(()()((((("
您还应该使用 .forEach()
而不是 .filter()
,因为您没有过滤并使用 .filter()
returns.
这是另一种方法,它涉及创建一个 Map(类似于一个对象),它将每个字符的频率保存为一个值。使用 .replace()
我们可以 return 一个新字符串,我们根据每个字符是否出现多次来替换它:
const duplicateEncode = (word) => {
const lower = word.toLowerCase();
const charFreq = [...lower].reduce((map, c) => map.set(c, (map.get(c) ?? 0) + 1), new Map);
return lower.replace(/./ug, (c) => charFreq.get(c) === 1 ? "(" : ")");
}
console.log(duplicateEncode("din")); // "((("
console.log(duplicateEncode("recede")); // "()()()"
console.log(duplicateEncode("Success")); // ")())())"
console.log(duplicateEncode("(( @")); // "))(("
console.log(duplicateEncode("nGnnI)nPne@uwJ")); // ")())(()()((((("