我已经为回文编写了这个js代码,我知道在线有更好更有效的回文方法,但我想知道为什么我无法使我的回文功能正常工作?
代码:
var pal = function(str) {
var len = str.length;
for (var i = 0; i < len; i++) {
var comp1 = str.substring(i, i + 1);
for (var j = len; j > 0; j--) {
var comp2 = str.substring(j - 1, j);
}
if (comp1 != comp2) {
console.log("not palindrome")
break;
} else {
console.log('palindrome')
}
}
}
pal('maddog');
输出:
palindrome
not palindrome
答案 0 :(得分:2)
有许多更好的算法来检查回文。让我们使用您正在使用的类似算法。
我们基本上使用两个指针 - 左和右,并同时移动到中间。在原始问题中,左指针和右指针不会同时移动。
指针应该像这样移动 -
a b c b a
^ ^
a b c b a
^ ^
a b c b a
^
var isPalindrome = function (str) {
for (var i = 0, j = str.length-1; i < j; i++ , j--) {
if (str[i] != str[j]) {
return false;
}
}
return true;
}
console.log('maddog : ' + isPalindrome('maddog'));
console.log('abcba : ' + isPalindrome('abcba'));
console.log('deed : ' + isPalindrome('deed'));
console.log('a : ' + isPalindrome('a'));
答案 1 :(得分:1)
尝试以下代码。它的工作原理是将字符串长度除以2,然后迭代,检查相互映射的字符:
var pal = function(str){
var len = str.length;
for(var i = 0; i < Math.floor(len/2); i++){
if(str[i] != str[(len-1)-i]){
return false;
}
}
return true;
}
console.log(pal("bunny"));
console.log(pal("amoreroma"));
答案 2 :(得分:0)
你真的不需要嵌套循环,你可以只是向后循环通过字符串来反转字符串,然后将它与原始字符串进行比较。我更新了Snippet以便工作。
之前,您的代码没有反转字符串,而只是迭代字符并将它们分配给comp1
和comp1
变量。您需要连接字符串以便向后构建新字符串comp = comp + str.substring(j-1, j);
var pal = function(str) {
var len = str.length;
var comp = '';
for (var j = len; j > 0; j--) {
comp = comp + str.substring(j - 1, j);
}
if (str !== comp) {
console.log("not palindrome")
return;
}
console.log('palindrome')
}
pal('arepera');
答案 3 :(得分:0)
内环完全没必要。它每次都做同样的事情 - 它从最后开始遍历整个字符串,重复设置comp2
到字符;当它完成时,comp2
总是包含第一个字符。所以你的函数只测试字符串中的每个字符是否与第一个字符相同。
要测试某些东西是否是回文,您需要将每个字符与字符串另一端的相应字符进行比较。你不需要两个循环。你也只需要遍历字符串的前半部分,而不是整个字符串。
最后,您应该只在循环结束时回显Palindrome
。在循环内部,您只知道一个字符匹配,而不是全部匹配。
var pal = function(str) {
var len = str.length;
var half = Math.floor(len / 2);
var isPal = true;
for (var i = 0; i < half; i++) {
var comp1 = str[i];
var comp2 = str[len - i - 1];
if (comp1 != comp2) {
console.log("not palindrome")
isPal = false;
break;
}
}
if (isPal) {
console.log('palindrome')
}
}
pal('maddog');
pal('maddam');