我在javascript中遇到了一个回文函数的问题
I am having trouble with a palindrome function in javascript
这是我的代码:该函数适用于输入:"眼睛"、"赛车"、"不是回文"、"一个人、一个计划、一条运河。巴拿马"、"从不奇怪或偶数"。。。然而,当输入为"almostola"时,它会返回"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");
您只检查最后一个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.
在去除噪声后,我真的会替换下面这样的回文检查函数:
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"));
工作符合预期。
为什么您的旧代码不起作用
它只检查第一个正确的东西并返回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;
比较第一个字母和最后一个字母。如果它们相同,则代码返回"True",而不检查字符串中的其他字母。即使循环的第一次迭代产生"True",比较也应该继续!
您可以使用一个更简单的函数来检查单词是否为回文:
function checkPalindrom(str) {
return str == str.split('').reverse().join('');
}
checkPalindrom("almostomla"); // false
相关文章:
- Javascript回文逻辑
- 与 promise 一起使用时,异步瀑布不执行下一个回调方法
- Angular,设置一个回调函数,用于在工厂和控制器之间更新
- 使用 CoffeeScript 的类和 jquery.transit 创建一个回调循环
- 如何通过一个回调异步排队和执行多个promise
- jQuery:在除一个输入文本字段之外的所有文档上激发keyup
- 如何创建一个函数来检查日期是否为回文
- 如何检查字符串是否为回文JavaScript〔CLOSED!〕
- 查找系列中的下一个HTML文档
- 用于回文变位的JavaScript解决方案
- 带有一个回调的多个循环ajax请求
- 从javascript打开一个word文档
- jQuery中的多个同时Ajax请求(带有一个回调)
- 我在javascript中遇到了一个回文函数的问题
- 将href链接到另一个HTML文档中的锚点并将其居中
- 如何将回调方法发送到另一个回调方法
- Meteor.js HTTP.get 获取 JSON 引号并解析结果似乎包含一个回调函数
- 如何创建一个接受输入的函数并测试它是否是回文
- 尝试创建一个能够解释空格的回文函数
- 试图找到如果一个数字是一个回文在JS