【问题标题】:codewar challenge javascript代码战挑战 javascript
【发布时间】:2018-01-21 12:28:16
【问题描述】:

我希望每个人都过得愉快。

这是我在 * 上的第一篇文章!

我刚刚完成了 codeacademy 上的 javascript 课程,并且还阅读了几本关于它的书。现在我在进行代码战。我会将自己归类为 Javascript 的初学者。

我发现 myslef 有点卡在一个挑战上,请有人能解释一下我可能做错了什么吗?非常感谢!

这里是说明:

检查一个字符串是否有相同数量的 'x's 和 'o's。该方法必须返回一个布尔值并且不区分大小写。字符串可以包含任何字符。

这是我的代码:

function XO(str) {
    var x = [];
    var o = [];

    for (var i = 0; i <= str.length; i++) {
        if (str(i).toLowerCase === "x") {
            x.push(i);
        } else if (str(i).toLowerCase === "o") {
            o.push(i);
        }

        if (x.length === o.length) {
            return true;
        } else {
            return false;
        }
    }
}

【问题讨论】:

  • 将你的长度检查移出 for 循环
  • 你的代码格式还不是很好
  • 为什么不使用内置的字符串函数?

标签: javascript arrays function loops


【解决方案1】:
function XO(str) {
    var x = 0, // numbers are better
        o = 0;

    for (var i = 0; i < str.length; i++) { // changed from '<=' to '<'
        if (str[i].toLowerCase() === "x") {
            x++;
        } else if (str[i].toLowerCase() === "o") {
            o++;
        }
    }
    return x === o;
}

【讨论】:

    【解决方案2】:

    str.match(/x/g).length==str.match(/o/g).length

    【讨论】:

      【解决方案3】:

      function checkIfOequalsX(str){
        return str.match(/x/g).length==str.match(/o/g).length
      }
      
      console.log(checkIfOequalsX('xxooxo'));
      console.log(checkIfOequalsX('xxooxoo'));

      你可以用

      str.match(/x/g).length==str.match(/o/g).length
      

      【讨论】:

        【解决方案4】:

        我纠正错误并使用代码注释来解释

        function XO(str) {
            var x = [];
            var o = [];
            for (var i = 0; i < str.length; i++) { // i must be lower than length
                // str[i] or str.charAt(i), not str(i)
                if (str[i].toLowerCase() === 'x') { // toLowerCase is function, it must be called with toLowerCase()
                    x.push(str[i]); // should push character
                } else if (str[i].toLowerCase() === 'o') {
                    o.push(str[i]);
                }
            }
            // return statement must be located at the end
            if (x.length == o.length) {
                return true;
            } else {
                return false;
            }
        }
        console.log(XO('xo'));
        console.log(XO('xxo'));
        console.log(XO('xoX'));
        console.log(XO('xoOX'));

        【讨论】:

        • 非常感谢,也感谢所有回复的人。我只是想问一下,如果我使用 [i] 而不是 (i) 有什么区别...我知道 [i] 的工作方式是通过数组的索引但是当人们使用时我有点困惑它在 (i) 方法中。我知道这对许多人来说可能是一个愚蠢的问题,但如前所述,我刚刚开始使用 javascript。谢谢大家
        • 括号用于方法调用。喜欢str[i].toLowerCase()。这里toLowerCase 是一个方法。尖括号[] 用于访问或更改 JSON 或数组数据对象中的值。两者是完全不同的东西。
        【解决方案5】:

        第三个 if else 永远不会被执行,因为对于一个字符串来说总会有一个值。

        如果要返回计数,则应在 for 循环之后执行长度检查。

        var xCount = 0; var oCount = 0;
        for (var i = 0; i < str.length; i++) {
          if (str[i].toLowerCase() === "x") {
            xCount++;
          } else if (str[i].toLowerCase() === "o") {
            oCount++;
          }
        }
        
        return xCount === oCount;
        

        关于另一个包含基于str.match方法的检查的解决方案,使用该段代码的复杂度是上面的两倍,因为str.match循环执行了两次以匹配两个字符串。

        【讨论】:

        • 这是最好的答案,因为您只需循环一次。
        • 如果你循环一两次,复杂度是一样的。执行的指令数很重要
        • 正如另一个答案已经解释的那样,&lt;= str.length 还有另一个问题。
        • 当然,但不是 O 时间 O(n) vs O(2n)?
        • 你需要使用toLowerCase()而不是toLowerCase,因为后者是函数代码,而前者是函数返回的值,也就是说str(i).toLowerCase === "x"true对于任何字符str(i).
        【解决方案6】:
        function XO(str) {
          let strn = str.toLowerCase();
          let countX = []; 
          let countO = []; 
          for(let i=0; i<strn.length; i++) {
            if(strn[i] == 'x') {
              countX.push(strn[i])
            } else if(strn[i] == 'o') {
              countO.push(strn[i])
            }
          }
        
          if(countX.length == countO.length){
            return true
          } else if(countX.length !== countO.length) {
            return false
          }
        }
        

        【讨论】:

          【解决方案7】:

          您可以使用正则表达式来查找这些字符:

          function XO(str) {
           return str.match(/o/ig).length === str.match(/x/ig).length;
          }
          

          【讨论】:

            【解决方案8】:
            function XO(str) {
               let letraO = 0
               let letraX = 0
               const myArray = str.toLowerCase();
               for (i=0; i<myArray.length; i++){
                  myArray[i] === 'o'? letraO++ : letraX ++
               }
               return letraO===letraX? true : false    
            }
            

            【讨论】: