回文

本文介绍了回文的概念,包括回文数和回文串,并提供了两种判断回文的方法:一种是从回文的含义出发,利用字符串反转进行对比;另一种是通过首尾双指针检查字符的对称性。对于回文数,文章详细阐述了如何通过取余和除法操作判断其是否为回文,同时考虑了溢出和特殊数值(如负数、末位为0的数)的情况。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

回文(回文),不是指回族文字(汗,小编第一次以为的),是指数或者字符串具有首尾回环性质,从后向前按位颠倒后与原文一样。首尾回环的数字就是回文数,如:121,12321;首尾回环的字符串就是回文串,如:'madam'。 

回文的含义是逆向与原文一样,性质是中位对称;验证回文可以分别从回文的本质和性质两个方面考虑。 

从回文的含义考虑,就是暴力版,利用O(n)的空间存储反转后的字符串,然后与原字符串对比。 

var isPalindrome = function(x) {
    let reverse=''
    for(let i = x.length-1;i>=0 ;i--){
        reverse += x[i];
    }
    return reverse === x;
};

在暴力版的基础上,可以借用Array的reverse方法,简单实现反转。

var isPalindrome = function(x) {
    return x.split('').reverse().join('') === x;
};

从回文中位对称的性质考虑,可以采用首尾双指针的方法,逐一比较首尾字符,只要遇到一个不匹配的,就不是回文。此方法需要的时间复杂度是O(n),但是需要的空间复杂度是O(1);

var isPalindrome = function(x) {
    let length=x.length;
    for(let i=0;i<length/2 ;i++){
        if(x[i]!==x[length-i-1]) return false;
    }
    return true;
};

对于回文数,可以先转成字符串,再使用上面的方法判断。转换为字符串会有额外的空间开销,如果不使用字符串呢?也可以根据回文的含义和中位对称性质,来实现。回文数的反转可以利用取余运算获取末位数,利用除以10取整逐逐降位,依次循环直到取整后为0,取出所有数。例如,232%10 = 2 ,Math.floor(232/10)= 23; 23%10 = 3,Math.floor(23/10)= 2; 2%10 = 2,Math.floor(2/10)= 0.然后逐步把这些数字按位合成反转后的数:(2 * 10 +3)* 10 +2 = 232.到这里就有问题来,数是有上限的,如果反转后的数溢出呢?结合对称性考虑,我们可以只反转一半,然后把原数据降位一半,再比较两个数据,就可以得到是否为回文数。对与负数因为负号的存在,一定不会是回文,因此可以先判断掉;另外,对于末位是0的数据,只有首位为0才会 是回文,这种情况只有0本身满足,也要提前判断掉。

var isPalindrome = function(x) {
    if(x< 0 || (x%10 ===0 && x!==0)) return false;
    if(x===0) return true;
    let reverserData = 0;
    while(reverserData < x ){
        reverserData = (reverserData*10 + x%10) ; 
        x = Math.floor(x/10);   
    }
    return reverserData===x || x === Math.floor(reverserData/10);
};



评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值