Duplikujte JavaScript kodéru, zkuste použít indexOf, ale výstup je stále nesprávný

převést řetězec na nový řetězec, kde každý znak v novém řetězci je „(“, pokud se tento znak vyskytuje pouze jednou v původním řetězci, nebo „“)“, pokud se tento znak vyskytuje více než jednou. nemohu najít, kde dělám chybu

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

  2. “ustupovat” => “()()()”

  3. “Úspěch” => “)())())”

  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;
    }
    

Odpověď

Zdá se, že váš problém spočívá v tom, že používáte .indexOf() a .lastIndexOf() dne word , který obsahuje velká i malá písmena, ale e bude vždy malé písmeno z vašeho vstupu, což vede k .indexOf() a .lastIndexOf() nelze najít písmeno, když je velké. Místo toho uložte malou verzi svého vstupu do nové proměnné a použijte ji při volání .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")); // ")())(()()((((("

Měli byste také použít .forEach() místo .filter() protože nefiltrujete a nepoužíváte pole .filter() vrátí.

Zde je další přístup, který zahrnuje vytvoření mapy (podobné objektu), která drží frekvenci pro každý znak jako hodnotu. Pomocí .replace() můžeme vrátit nový řetězec, kde nahradíme každý znak podle toho, zda se objeví vícekrát nebo ne:

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