如何比较回文
How to compare Palindromes
不确定我做错了什么。我正在尝试比较 2 个字符串以查看它们是否是回文
function palindrome(str) {
var rem = str.replace(/\s/g, "");
var a = rem.split("");
var b = a.reverse();
for(var i = 0; i < rem.length; i++){
if (b[i] == a[i]){
return true;
}
return false;
}
}
palindrome("not a doctor"); //this should show false, but it's showing true
The reverse method transposes the elements of the calling array object in place, mutating the array, and returning a reference to the array.
这就是您获得 true
的原因。您的 a
和 b
变量似乎指向同一个对象。
顺便说一句,正如其他人在下面指出的那样,您的方法似乎有些缺陷。因此,可以为您的任务提供更好的解决方案(未经过适当测试):
function isPalindrome(input) {
var str = input.replace(/\s/g, "").toLowerCase();
var left = 0, right = str.length - 1;
while( left <= right) {
if(str[left] !== str[right]) return false;
left++; right--;
}
return true;
}
console.log(isPalindrome("your string")); // false
console.log(isPalindrome("Drawn onward")); //true
我们的想法是比较修改后(没有空格和小写)字符串两端的相应符号。如果它们在某个时候不匹配,那么这不是回文。
您的代码有两个问题。
如@curveball 所述,您的 a 和 b 变量是对相同对象的引用,因为 reverse 修改了原始数组。
此外,只要 a 数组中的第一个元素等于 b 数组中的第一个元素,您就 return 为真。一旦一个元素与另一个元素不同,您就必须 return false。但是比较所有数组中的元素后只能return为真
function palindrome(str) {
var rem = str.replace(/\s/g, "");
var a = rem.split("");
var b = a.slice().reverse();
for(var i = 0; i < rem.length; i++){
if (b[i] !== a[i]){
return false;
}
}
return true;
}
palindrome("not a doctor");
此外,用于检查字符串是否为回文的另一种(也是典型的)算法是比较(删除空格后)第一个位置与最后一个位置、第二个位置与倒数第二个位置等。这样就可以了没有必要克隆(和反转)数据。
正如其他人所说,您的 a
和 b
指向同一个对象,因此您需要先克隆它。
另外你不能立即return true
,更好的方法是在整个循环结束后检查不等式和return true
。
function palindrome(str) {
var rem = str.replace(/\s/g, "");
var a = rem.split("");
var b = a.slice().reverse();
console.log(a, b);
for(var i = 0; i < rem.length; i++){
if (b[i] != a[i]){
return false;
}
}
return true;
}
console.log(palindrome("lol 1"));
您的代码存在一些问题。
问题 1:您正在使用 reverse
方法来改变原始数组(请参阅 reverse 上的文档)。所以变量 a 和 b 将具有相同的值,即原始数组的反向字符串。您可以做的是创建一个全新的数组并将其分配给变量 b
,如下所示:
var b = [].concat(a).reverse();
问题 2:您忘记检查字符串中的所有字母。您 return 设置函数的方式太早了。例如,对于不是回文的输入字符串 'aada',它将 return 为真。这是因为,您的函数会在评估两个数组的第一个字符串的相似性后立即退出。要解决此问题,您可以这样做:
function palindrome(str) {
var rem = str.replace(/\s/g, "");
var a = rem.split("");
var b = [].concat(a).reverse();
for(var i = 0; i < rem.length; i++){
if (b[i] !== a[i]){
return false;
}
}
return true
}
您甚至可以像这样进一步优化您的功能:
function palindrome(str) {
const len = str.length;
const halfLen = len/2;
for (let i = 0; i < halfLen; i++) {
if (str[i] !== str[len - 1 - i]) return false;
}
return true;
}
回文串前后读取相同,所以你可以比较第一个和最后一个,第二个和倒数第二个等等,直到你到达中间字符。
希望对您有所帮助。
不确定我做错了什么。我正在尝试比较 2 个字符串以查看它们是否是回文
function palindrome(str) {
var rem = str.replace(/\s/g, "");
var a = rem.split("");
var b = a.reverse();
for(var i = 0; i < rem.length; i++){
if (b[i] == a[i]){
return true;
}
return false;
}
}
palindrome("not a doctor"); //this should show false, but it's showing true
The reverse method transposes the elements of the calling array object in place, mutating the array, and returning a reference to the array.
这就是您获得 true
的原因。您的 a
和 b
变量似乎指向同一个对象。
顺便说一句,正如其他人在下面指出的那样,您的方法似乎有些缺陷。因此,可以为您的任务提供更好的解决方案(未经过适当测试):
function isPalindrome(input) {
var str = input.replace(/\s/g, "").toLowerCase();
var left = 0, right = str.length - 1;
while( left <= right) {
if(str[left] !== str[right]) return false;
left++; right--;
}
return true;
}
console.log(isPalindrome("your string")); // false
console.log(isPalindrome("Drawn onward")); //true
我们的想法是比较修改后(没有空格和小写)字符串两端的相应符号。如果它们在某个时候不匹配,那么这不是回文。
您的代码有两个问题。
如@curveball 所述,您的 a 和 b 变量是对相同对象的引用,因为 reverse 修改了原始数组。
此外,只要 a 数组中的第一个元素等于 b 数组中的第一个元素,您就 return 为真。一旦一个元素与另一个元素不同,您就必须 return false。但是比较所有数组中的元素后只能return为真
function palindrome(str) {
var rem = str.replace(/\s/g, "");
var a = rem.split("");
var b = a.slice().reverse();
for(var i = 0; i < rem.length; i++){
if (b[i] !== a[i]){
return false;
}
}
return true;
}
palindrome("not a doctor");
此外,用于检查字符串是否为回文的另一种(也是典型的)算法是比较(删除空格后)第一个位置与最后一个位置、第二个位置与倒数第二个位置等。这样就可以了没有必要克隆(和反转)数据。
正如其他人所说,您的 a
和 b
指向同一个对象,因此您需要先克隆它。
另外你不能立即return true
,更好的方法是在整个循环结束后检查不等式和return true
。
function palindrome(str) {
var rem = str.replace(/\s/g, "");
var a = rem.split("");
var b = a.slice().reverse();
console.log(a, b);
for(var i = 0; i < rem.length; i++){
if (b[i] != a[i]){
return false;
}
}
return true;
}
console.log(palindrome("lol 1"));
您的代码存在一些问题。
问题 1:您正在使用 reverse
方法来改变原始数组(请参阅 reverse 上的文档)。所以变量 a 和 b 将具有相同的值,即原始数组的反向字符串。您可以做的是创建一个全新的数组并将其分配给变量 b
,如下所示:
var b = [].concat(a).reverse();
问题 2:您忘记检查字符串中的所有字母。您 return 设置函数的方式太早了。例如,对于不是回文的输入字符串 'aada',它将 return 为真。这是因为,您的函数会在评估两个数组的第一个字符串的相似性后立即退出。要解决此问题,您可以这样做:
function palindrome(str) {
var rem = str.replace(/\s/g, "");
var a = rem.split("");
var b = [].concat(a).reverse();
for(var i = 0; i < rem.length; i++){
if (b[i] !== a[i]){
return false;
}
}
return true
}
您甚至可以像这样进一步优化您的功能:
function palindrome(str) {
const len = str.length;
const halfLen = len/2;
for (let i = 0; i < halfLen; i++) {
if (str[i] !== str[len - 1 - i]) return false;
}
return true;
}
回文串前后读取相同,所以你可以比较第一个和最后一个,第二个和倒数第二个等等,直到你到达中间字符。
希望对您有所帮助。