C++ 判断回文数 详细版 (超级简洁,很有趣的思路)【原有数字逆转,然后比较两数字是否相同,会有溢出】解决办法

【思路1】:把原有数字逆转,然后比较两数字是否相同。(不安全)

但是由于int的限制,很可能会发生正向的数字没有溢出,但是反向的数字就溢出的情况

(例如:2147483647,调转过来就溢出了)

Int溢出后会不断减去或者加上4294967296直至整数范围落在-2147483648 ~ 2147483647内,所以如果直接调转过来可能会导致整数数值的变化,从而导致比较的不正确。

【思路2】而是把整数先一位一位存在数组中,然后一位一位比较,但是这样涉及到比较的次数就较多,而且还使用了数组作为辅助内存。

class Solution {
public:
    bool isPalindrome(int x) {
        if(x<0|| (x!=0 && x%10==0)) return false;
        int sum=0;
        while(x>sum)
        {
            sum = sum*10+x%10;
            x = x/10;
        }
        return (x==sum)||(x==sum/10);
    }
};

思路就很有价值:没有把整个数翻转过来,而是只翻转了一半(利用条件:x>sum),所以出while循环时的可能性只有两种:1.x与sum同位数,但是sum>=x(原整数是偶数位情况)  2.sum比x高一位(原整数是奇数位情况)

而这也导致了最终判断条件是两个((x==sum)||(x==sum/10)

利用翻转一半的方法,就彻底规避了整数超出范围的情况,非常的机智。

你可能感兴趣的:(C++)