js实现一个函数判断输入字符串是否为回文(基础面试题四)

题目:实现一个函数,这个函数可以用来判断输入字符串是否为回文。忽略大小写,如Helleh,王中王等。

首先解这题的首要问题是理解回文这个概念,回文的定义是把相同的词汇或句子,在下文中调换位置或颠倒过来,产生首尾回环的情趣,叫做回文,也叫回环。

分析:

1)既然知道了回文的概念,那么我们很明显的知道这题需要遍历,也明白遍历到回文中间的那个字符的对应索引就可以了

2)然后对前面一半遍历的字符与后面遍历的一半字符进行比较,如果相同就是回文;如果不同就不是回文

3)可是到底该怎么实现遍历前一半字符和后面一半字符呢?这个是该题的主要思路

4)遍历的话,是从索引为0开始的,也就是我们常用到的for循环,定义一个i=0,然后这个i遍历的长度为字符串的一半;这个时候又要分析输入的字符串是奇数个还是偶数个,偶数个好解决,那么奇数个呢?

5)也很好解决,奇数个主要是遍历其+1的一半,例如输入字符串有7个,那么我们原本遍历的i值最终为3,也就是中间的那个,即第四个,刚好的是(7+1)/2=4。

6)那么又有同学会有疑问了,那么偶数个呢?比如输入字符串有8个,也要用(str.length+1)/2的形式吗?这里的回答是:是,为了更优的性能,最好写成同样的形式。那么(8+1)/2不是等4.5吗?这个怎么解决?用parseInt取整和其他取整方式都可以,但是一定要注意,不能向上取整和四舍五入。

7)遍历后一半,后一半的索引该怎么实现呢?要想前一半和后一半相同,那么遍历的方式应该是这样子。例如输入字符串的长度为12,那么遍历的时候,遍历i=0时的字符串应该等于遍历i=11时的字符串相同,遍历i=1时的字符串与i=10的字符串相同...

8)那到底怎么实现?我们能发现两个i相加再加1就是字符串的总长度,那可以先这样写后再总结,i=0时,str[i]==str[str.length-1];i=1时,str[i]==str[str.length-1-1];i=2时,str[i]==str[str.length-1-2]....好像找到规律了,后面的str.length-1是固定的,跟着就是减去与i对应的值。那么总的实现应该是这样的:str[i]==str[str.length-1-i]

代码实现如下:

function isPalindrome(str){
    if (typeof str !== 'string' || str.constructor !== String) {
	return false;
    }
    var len = parseInt((str.length+1)/2);
    for(var i=0; i<len; i++){
	if (str[i] !== str[str.length-i-1]) {
	    return false;
	}
    }
    return true;
}
console.log(isPalindrome('adddddda'));//true
console.log(isPalindrome('addddda'));//true
console.log(isPalindrome('adddasd'));//false

这题要想实现,懂算法的人可以很快速的写下方法,但是毕竟这样的学习适合初级人员,初级人员在做这道题的时候,最好用笔在草稿纸上写下自己的思路和做法,这也是见证自己能力的一种方式,而且也锻炼自己的逻辑。

题目来源于微信公众号:较真的前端

猜你喜欢

转载自blog.csdn.net/charles_tian/article/details/79923512