我的回文有什么问题? (javascript)
Whats wrong with my palindrome? (javascript)
我写了这个回文的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
你真的不需要嵌套循环,你可以通过字符串向后循环来反转字符串,然后将它与原始字符串进行比较。我更新了代码段以供使用。
之前,您的代码不是反转字符串,而是只是遍历字符并将它们分配给 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');
试试下面的代码。它的工作原理是将字符串长度除以 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"));
内循环完全没有必要。它每次都做同样的事情——它循环遍历整个字符串,从末尾开始,重复设置 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');
有很多更好的算法来检查回文。让我们使用您正在使用的类似算法。
我们基本上使用了两个指针——左指针和右指针,同时移动到中间。在原题中,左指针和右指针不会同时移动。
指针应该像这样移动 -
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'));
我写了这个回文的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
你真的不需要嵌套循环,你可以通过字符串向后循环来反转字符串,然后将它与原始字符串进行比较。我更新了代码段以供使用。
之前,您的代码不是反转字符串,而是只是遍历字符并将它们分配给 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');
试试下面的代码。它的工作原理是将字符串长度除以 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"));
内循环完全没有必要。它每次都做同样的事情——它循环遍历整个字符串,从末尾开始,重复设置 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');
有很多更好的算法来检查回文。让我们使用您正在使用的类似算法。
我们基本上使用了两个指针——左指针和右指针,同时移动到中间。在原题中,左指针和右指针不会同时移动。
指针应该像这样移动 -
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'));