回文检查器-for循环问题

时间:2019-02-25 19:43:40

标签: javascript

我正在学习javaScript并编写回文检查器进行练习。它不起作用,通过使用print语句,我将其范围缩小到了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;
  }
}

3 个答案:

答案 0 :(得分:1)

我进行了一些更改以使其工作:

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

以下是代码段:

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

答案 1 :(得分:0)

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

最大的问题当然是您的for循环检查您的forwardsArray的每一项是否等于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 :(得分:0)

当然,到现在为止,您已经意识到自己对此事有过多的思考。

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和字符串之间进行了直接比较,如果它们相等,则为回文,否则为非回文。