回文

回文(回文),不是指回族文字(汗,小编第一次以为的),是指数或者字符串具有首尾回环性质,从后向前按位颠倒后与原文一样。首尾回环的数字就是回文数,如: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

对于回文数,可以先转成字符串,再使用上面的方法判断。转换为字符串会有额外的空间开销,如果不使用字符串呢?也可以根据回文的含义和中位对称性质,来实现。回文数的反转可以利用取余运算获取末位数,利用除以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);
};



你可能感兴趣的:(基础算法)