【问题标题】:Palindrome Checker - issue with for loop回文检查器 - for 循环的问题
【发布时间】:2019-02-25 19:43:39
【问题描述】:

我正在学习 javaScript 并编写一个回文检查器来练习。它不起作用,通过使用打印语句,我将其范围缩小为我的 for 循环的问题。我不明白为什么它不起作用;有没有人能解释一下?

function palindrome(str) {
  var newString = str.replace(/[^a-z0-9]/g, '').toLowerCase();
  console.log(newString)
  var forwardsArray = newString.split("");
  console.log(forwardsArray)
  var backwardsArray = forwardsArray.reverse();
  console.log(backwardsArray)
  for (var i = 0; i < backwardsArray.length; i++) {
    for (var j = 0; j < forwardsArray.length; j++) {
      console.log(backwardsArray[i])
      console.log(forwardsArray[i])
      if (forwardsArray[j] !== backwardsArray[i]) {
        return false;
      }
    }
    return true;
  }
}

【问题讨论】:

  • 您的代码似乎正在检查数组的每一项与另一个数组的每一项。因此,只有当您的输入类似于 aaaaaaa 时它才会起作用。就做function palindrome(str) {return str === str.split("").reverse().join("");}
  • 这是对回文的大量代码检查,哈哈!但是您可能想在发布问题之前先搜索论坛。
  • @NiettheDarkAbsol 你评论中多余的“=”让我失望了。 :D.. *按照下面的 khauri McClain 点编辑,我学到了一些新东西。
  • @schar 这不是一个额外的= 这是一个strict equality comparison

标签: javascript


【解决方案1】:

我同意其他评论者的观点,即有 better ways to find palindromes,但我认为这是一个很好的学习机会,因为您的代码中有一个常见的初学者陷阱,您可能会从了解中受益。

最大的问题当然是你的 for 循环会检查你的backwardsArray 的每一项是否等于你的forwardsArray 的每一项,除非你的单词只包含所有相似的字符,否则这是不正确的。

实际上,您只是想检查前向数组中的字符是否与后向数组中相同索引处的字符等价,因此您只需要一个 for 循环。

但一个不太明显的问题是Array.reverse 将数组“原地”反转。这意味着当您调用 reverse 而不是返回新副本时, forwardsArray 会被修改,因此 backwardsArray 和 forwardsArray 引用完全相同的数组。

您应该在此处克隆数组。一种流行的方法就是使用Array.slice

function palindrome(str) {

  var newString = str.replace(/[^a-z0-9]/g, '').toLowerCase();

  var forwardsArray = newString.split("");
  // Copy the array
  var backwardsArray = forwardsArray.slice().reverse();
  
  for (var i = 0; i < backwardsArray.length; i++) {
      var backwardChar = backwardsArray[i]
      var forewardChar = forwardsArray[i]
      if(backwardChar !== forewardChar){
        return false
      }
  }
  return true;
}

console.log(palindrome("racecar")) // true

console.log(palindrome("ralecar")) // false

【讨论】:

    【解决方案2】:

    现在你当然发现你想多了。

    function palindrome(str) {
      const newString = str.replace(/[^a-z0-9]/g, '').toLowerCase();
      const reversed = newString.split('').reverse().join('');
    
      return newString === reversed;
    }
    
    palindrome("abba"); // true
    palindrome("abcd"); // false
    

    所以我离开了newString 逻辑,但是在这样做之后,在一天结束的时候,你将采用相同的newString 并将其拆分、反转并加入它,然后将其与原来的比较字符串,在你的情况下,newString。

    所以你直接比较 reversed 和你的字符串,如果它们相等,那么它是一个回文,如果不是,那么它不是一个回文。

    【讨论】:

      【解决方案3】:

      我做了一些更改以使其正常工作:

      • 删除了第二个 for 循环(没有必要)
      • 使用array[i] !== array[array.length-i-1] 条件而不是反转数组
      • 仅循环到数组的一半(如果前半部分匹配,则后半部分也匹配)

      这里是sn-p:

      function palindrome(str) {
        var newString = str.replace(/[^a-z0-9]/g, '').toLowerCase();
        var array = newString.split("");
        for (var i = 0; i < array.length/2; i++) {
          if (array[i] !== array[array.length-i-1]) {
            return false;
          }
        }
        return true;
      }
      
      console.log(palindrome('abcba')) //true
      console.log(palindrome('abcde')) //false

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-10-31
        • 1970-01-01
        • 2018-11-05
        相关资源
        最近更新 更多