You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

JavaScript回文函数问题:结果异常且无法移除下划线

修复你的回文判断函数问题

我看到你的代码里有几个关键问题导致结果全部不符合预期,而且下划线也没被正确移除,咱们一个个拆解解决:

1. 正则表达式错误(下划线未被移除)

你写的正则/[^\w_]/gi逻辑搞反了:\w本身就包含字母、数字和下划线,这个正则的意思是「匹配不是单词字符且不是下划线的字符」——相当于直接保留了下划线和所有单词字符,完全不符合你要移除非字母数字的需求。

正确的正则应该匹配所有非字母数字的字符(包括下划线),推荐两种写法:

  • /[^a-zA-Z0-9]/gi:直接指定保留大小写字母和数字,其余全部移除
  • /[\W_]/gi\W\w的反义(非单词字符),加上下划线后,刚好覆盖所有非字母数字内容

2. 循环里的两个致命错误

  • 你用原字符串str[i]去比较,但str没有经过任何处理(还带着空格、标点等),应该用处理后的repStr[i]
  • repStr[len] - i是把字符的ASCII码和i做减法运算,而不是取对应索引的字符!正确的索引写法是repStr[len - i]

3. 其他优化点

  • len = repStr.length -1没有用var/let/const声明,会变成全局变量,建议加上声明避免污染全局作用域
  • 循环条件i <= len会让循环重复比较中间字符(比如长度为奇数的字符串),改成i < repStr.length / 2只比较前半段,效率更高

修正后的完整代码

function palindrome(str) { 
  // 匹配所有非字母数字字符(含下划线)并替换为空
  var exc = /[\W_]/gi; 
  var repStr = str.toLowerCase().replace(exc, ""); 
  console.log("Replaced string: " + repStr); 
  const len = repStr.length - 1;
  // 仅比较字符串前半段即可
  for (var i = 0; i < repStr.length / 2; i++) { 
    if (repStr[i] !== repStr[len - i]) { 
      return false; 
    } 
  } 
  return true; 
} 

// 运行测试用例
console.log(palindrome("eye")); // true
console.log(palindrome("_eye")); // true
console.log(palindrome("race car")); // true
console.log(palindrome("not a palindrome")); // false
console.log(palindrome("A man, a plan, a canal. Panama")); // true
console.log(palindrome("never odd or even")); // true
console.log(palindrome("nope")); // false
console.log(palindrome("almostomla")); // false
console.log(palindrome("My age is 0, 0 si ega ym")); // true
console.log(palindrome("1 eye for of 1 eye.")); // false
console.log(palindrome("0_0 (: /-\\ :) 0-0")); // true
console.log(palindrome("five|\\_|/|four")); // false

现在运行测试用例,结果就完全符合预期了:下划线被正确移除,回文判断逻辑也准确。比如_eye处理后变成eye,会返回true0_0 (: /-\ :) 0-0处理后变成0000,也能正确识别为回文。

内容的提问来源于stack exchange,提问作者Hacene .N

火山引擎 最新活动