JavaScript中的回文函数



我需要这个回文赋值的帮助(无论空格、符号和标点符号如何,从后面读取的单词都应该显示为true)。我看不出有什么问题,但它不能正常工作。问题是regex不好,但我在regexr上测试了regex,它应该可以

有人看到问题出在哪里了吗?

提前谢谢。

function palindrome(str) {
var pal = str;
pal.replace(/[W_]/g, "");
pal.toLowerCase();
var arr = pal.split("");
arr.reverse();
var pal2 = arr.join("");
if(pal2 === pal){
return true;
}
else{
return false;
}
}

//this should show true but its false
palindrome("_eye");

正如我在注释中所说,您的代码不起作用,因为它假设replace()toLowerCase()都增加了它们的参数。但他们没有,他们返回一个新字符串,而不是修改给定的字符串。因此,在您的示例中,_符号仍然存在于比较例程中,扰乱了预期的结果。

另一个注意事项是:当函数的结果基于某种比较运算时,不需要使用if。你可以随时替换这个:

if (a === b) {
return true;
}
else {
return false;
}

简单:

return a === b;

谈到这项任务:虽然拆分-反向连接-比较是最简单的方法(请查看@adeneo的评论以获得一条漂亮的单行线),但它并不是最佳的。想想看:你只需要把绳子的两半互相比较一下。有一种方法:

function isDirectPalindrome(str) {
var i = 0, j = str.length - 1;
while (i < j) {
if (str.charAt(i++) !== str.charAt(j--)) {
return false;
}
}
return true;
}
function isPalindrome(str) {
return isDirectPalindrome(str.replace(/[W_]+/g, '').toLowerCase());
}

这里有两个函数:第一个函数总是检查字符串是否是的回文(这里没有"noise"符号),第二个函数预先对字符串进行规范化。这使得在需要的时候重用第一个变得更加简单

当然,这只是一个测试。但我认为在这里展示算法和模块化点既方便又有用

最新更新