我在 javascript 中遇到回文函数问题
I am having trouble with a palindrome function in javascript
这是我的代码:
该函数适用于输入:"eye"、"race car"、"not a palindrome"、"A man, a plan, a canal. Panama"、"never odd or even"...
但是,当输入为 "almostomla" 时,它 returns "true"。有人可以解释一下为什么吗?
function palindrome(str) {
var newStr = str.replace(/[^0-9a-zA-Z]/g, '');
newStr = newStr.replace(/\s+/g, '');
newStr = newStr.toLowerCase();
var arr = newStr.split('');
var arr2 =[];
for(x = 0; x < arr.length; x++){
arr2.push(arr[arr.length-1-x]);
}
for(y = 0; y < arr.length; y++){
if(arr[y] == arr2[y]){
return true;
}
else{
return false;
}
}
}
palindrome("almostomla");
您可以使用更简单的函数来检查一个单词是否为回文:
function checkPalindrom(str) {
return str == str.split('').reverse().join('');
}
checkPalindrom("almostomla"); // false
去除噪音后,我真的会像下面这样替换回文检查功能:
function palindrome(str) {
var newStr = str.replace(/[^0-9a-zA-Z]/g, '');
newStr = newStr.replace(/\s+/g, '');
newStr = newStr.toLowerCase();
var arr = newStr.split('');
return arr.join('') == arr.reverse().join('');
}
alert(palindrome("almostomla"));
alert(palindrome("never odd or even"));
按预期工作。
为什么您的旧代码不起作用?
它只检查第一个正确的东西和 returns true
。您应该从那里删除 return true
。你的代码是只要第一个和最后一个字符相同,就认为它是回文。
所以你的代码,更正后的形式将是:
function palindrome(str) {
var newStr = str.replace(/[^0-9a-zA-Z]/g, '');
newStr = newStr.replace(/\s+/g, '');
newStr = newStr.toLowerCase();
var arr = newStr.split('');
var arr2 = [];
for (var x = 0; x < arr.length; x++) {
arr2.push(arr[arr.length - 1 - x]);
}
for (var y = 0; y < arr.length; y++) {
debugger;
if (arr[y] != arr2[y]) {
return false;
}
}
return true; // Place it here to return after the whole loop.
}
alert(palindrome("almostomla"));
alert(palindrome("never odd or even"));
为什么不简单地这样做:
function palindrome(str) {
var isPalindrome = true;
var newStr = str.replace(/[^0-9a-zA-Z]/g, '');
newStr = newStr.replace(/\s+/g, '');
newStr = newStr.toLowerCase();
var arr = newStr.split('');
for(x = 0; x < arr.length / 2; x++) {
if(arr[x] != arr[arr.length - 1 - x])
{
isPalindrome = false;
break;
}
}
return isPalindrome;
}
您在比较完第一个条目后返回:
for(y = 0; y < arr.length; y++){
if(arr[y] == arr2[y]){
return true; // here you are returning
}
else{
return false;
}
}
所以在 almostomla
的情况下, arr
和 arr2
的第一个元素都是 a
因为字符串以 a
开头和结尾。
您可以这样做来检查第一个不匹配的条目:
var flag = true;
for(y = 0; y < arr.length; y++){
if(arr[y] != arr2[y]){
flag= false;
break;
}
}
return flag;
您只检查最后一个 for 循环中的第一个和最后一个字符。
for(y = 0; y < arr.length; y++){
if(arr[y] == arr2[y]){ //if first and last chars equal you are returning true.
return true;
}
else{
return false;
}
}
您应该检查所有字符,直到出现差异或结束。
for(y = 0; y < arr.length; y++){
if(arr[y] != arr2[y]){
return false;
}
}
return true; --that means two arrays are same.
你比较第一个和最后一个字母。如果它们相同,则代码 returns "True" 不检查字符串中的其他字母。即使循环的第一次迭代产生 "True"!
,比较也应该继续
这是我的代码: 该函数适用于输入:"eye"、"race car"、"not a palindrome"、"A man, a plan, a canal. Panama"、"never odd or even"... 但是,当输入为 "almostomla" 时,它 returns "true"。有人可以解释一下为什么吗?
function palindrome(str) {
var newStr = str.replace(/[^0-9a-zA-Z]/g, '');
newStr = newStr.replace(/\s+/g, '');
newStr = newStr.toLowerCase();
var arr = newStr.split('');
var arr2 =[];
for(x = 0; x < arr.length; x++){
arr2.push(arr[arr.length-1-x]);
}
for(y = 0; y < arr.length; y++){
if(arr[y] == arr2[y]){
return true;
}
else{
return false;
}
}
}
palindrome("almostomla");
您可以使用更简单的函数来检查一个单词是否为回文:
function checkPalindrom(str) {
return str == str.split('').reverse().join('');
}
checkPalindrom("almostomla"); // false
去除噪音后,我真的会像下面这样替换回文检查功能:
function palindrome(str) {
var newStr = str.replace(/[^0-9a-zA-Z]/g, '');
newStr = newStr.replace(/\s+/g, '');
newStr = newStr.toLowerCase();
var arr = newStr.split('');
return arr.join('') == arr.reverse().join('');
}
alert(palindrome("almostomla"));
alert(palindrome("never odd or even"));
按预期工作。
为什么您的旧代码不起作用?
它只检查第一个正确的东西和 returns true
。您应该从那里删除 return true
。你的代码是只要第一个和最后一个字符相同,就认为它是回文。
所以你的代码,更正后的形式将是:
function palindrome(str) {
var newStr = str.replace(/[^0-9a-zA-Z]/g, '');
newStr = newStr.replace(/\s+/g, '');
newStr = newStr.toLowerCase();
var arr = newStr.split('');
var arr2 = [];
for (var x = 0; x < arr.length; x++) {
arr2.push(arr[arr.length - 1 - x]);
}
for (var y = 0; y < arr.length; y++) {
debugger;
if (arr[y] != arr2[y]) {
return false;
}
}
return true; // Place it here to return after the whole loop.
}
alert(palindrome("almostomla"));
alert(palindrome("never odd or even"));
为什么不简单地这样做:
function palindrome(str) {
var isPalindrome = true;
var newStr = str.replace(/[^0-9a-zA-Z]/g, '');
newStr = newStr.replace(/\s+/g, '');
newStr = newStr.toLowerCase();
var arr = newStr.split('');
for(x = 0; x < arr.length / 2; x++) {
if(arr[x] != arr[arr.length - 1 - x])
{
isPalindrome = false;
break;
}
}
return isPalindrome;
}
您在比较完第一个条目后返回:
for(y = 0; y < arr.length; y++){
if(arr[y] == arr2[y]){
return true; // here you are returning
}
else{
return false;
}
}
所以在 almostomla
的情况下, arr
和 arr2
的第一个元素都是 a
因为字符串以 a
开头和结尾。
您可以这样做来检查第一个不匹配的条目:
var flag = true;
for(y = 0; y < arr.length; y++){
if(arr[y] != arr2[y]){
flag= false;
break;
}
}
return flag;
您只检查最后一个 for 循环中的第一个和最后一个字符。
for(y = 0; y < arr.length; y++){
if(arr[y] == arr2[y]){ //if first and last chars equal you are returning true.
return true;
}
else{
return false;
}
}
您应该检查所有字符,直到出现差异或结束。
for(y = 0; y < arr.length; y++){
if(arr[y] != arr2[y]){
return false;
}
}
return true; --that means two arrays are same.
你比较第一个和最后一个字母。如果它们相同,则代码 returns "True" 不检查字符串中的其他字母。即使循环的第一次迭代产生 "True"!
,比较也应该继续