重复编码器 JavaScript,尝试使用 indexOf 但输出仍然不正确

Duplicate Encoder JavaScript, try to use indexOf but the output is still incorect

将字符串转换为新字符串,如果新字符串中的每个字符在原始字符串中只出现一次,则为“(”,如果该字符出现多次,则为“)”。 找不到哪里出错了

  1. "din" => "((("

  2. "后退" => "()()()"

  3. “成功”=>“)())())”

  4. "((@" => "))(("

    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")); // ")())(()()((((("