为什么我的代码不能很好地替换字符串字符?

Why does my code not work out well replacing strings characters?

练习: 本练习的目标是将字符串转换为新字符串,其中新字符串中的每个字符为“(”(如果该字符在原始字符串中仅出现一次)或“)”(如果该字符在原始字符串中出现多次)细绳。判断字符是否重复时忽略大小写。

例子 “喧嚣”=>“(((“

“后退”=>“()()()”

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

"(( @" => "))(("

我的代码是这样的:

    function duplicateEncode(word) {
      let str = "";
    
      for (let i = 0; i < word.length; i++) { //This iteration is to examine every character in the string;
        for (let j = 0; j < word.length; j++) { //This iteration is to compare every character to every other inside the string, in order to check if there is any repetition
          if (j === i) { //This first conditon was selected because a character is not supposed to be compared to itself
            continue;
          } else if (word[i] === word[j]) {
            str = str + ")";
            break;
          } else if (j !== word.length - 1) {
            continue;
          } else if (j === word.length - 1) {
            str = str + "(";
          } 
        }
      }
      return str;
    }

有谁能帮我弄清楚为什么它不适用于所有情况?

例如:

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

它应该 return ((( 而不是 ((

但是,

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

return 正是它应该做的:)((((()

显然,只要一个字符串没有重复的字符,函数 return 就是一个没有第一个元素的字符串。但是,只要字符串至少有一个元素重复它,return 就完全符合预期。

我的代码怎么了?

我认为问题是当您使用下面的代码片段时,您阻止了自己进入最后一个循环。

if (j === i) { 
   continue;
}

只要最后一个字母不重复的单词就会出现此问题。即

这个有效

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

这不

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

你可以做的是添加一个声明当

i === word.length - 1

没有 "(" 在你的 str 变量,您可以将另一个 ")" 添加到您的 str.

换句话说,如果在遍历整个单词时检查最后一个位置后没有发现重复字符,那么最后一个也保证是唯一的。

以下控制台日志

function duplicateEncode(word) {
    let str = "";

    for (let i = 0; i < word.length; i++) { //This iteration is to examine every character in the string;
    for (let j = 0; j < word.length; j++) { //This iteration is to compare every character to every other inside the string, in order to check if there is any repetition
        console.log(i);
        console.log(j);
        console.log(str);
        if (j === i) { //This first conditon was selected because a character is not supposed to be compared to itself
            console.log("continue")
            continue;
        } else if (word[i] === word[j]) {
            console.log("append )")
            str = str + ")";
        break;
        } else if (j !== word.length - 1) {
            console.log("j !== length")
        continue;
        } else if (j === word.length - 1) {
            console.log("append (")
            str = str + "(";
        } 
    }
    }
    return str;
}

使用调试器逐行调试代码。在某些情况下,内部循环在没有满足向字符串添加字符的条件之一的情况下完成。

相反,使用布尔标志来表示字母是否重复,在循环内设置它(更简单的逻辑),然后在循环后执行 str += (found ? ')' : '(');。这确保您在外循环的每次迭代中恰好向输出字符串添加一个字符。