lintcode491回文数

描述

判断一个正整数是不是回文数。回文数的定义是,将这个数反转之后,得到的数仍然是同一个数。

例1:

输入:11
输出:true

例2

输入:1232
输出:false
解释:
1232!=2321

这道题我是用字符串反转对比做的,解题的话比较简单,如果是python代码一行就可以解决,用c++解题的话复杂些,提交完之后看了精品题解中,直接使用循环和整型直接做的,很好奇就看了一下,但是写题解的人并没有写相关思路的注释,我实在搞不懂为什么要除10 *10 以及 %10 后面在知乎上找到了相应的解释才豁然开朗.

    bool isPalindrome(int num) {
        // write your code here
        if (num < 0) return false;
        long long tmp = num, rev = 0;
        while (tmp) {
            rev = rev * 10 + tmp % 10;
            cout << tmp % 10 << endl;
            cout << "---" << endl;
            cout << rev << endl;
            tmp /= 10;
        }
        return rev == num;
    }

如果有和我一样不理解的朋友,可以看下面是摘抄一位老哥写的解题思路:

不转换字符串反转
根据方法一的想法,我们是转换为字符串后进行反转,但是这样会需要额外的空间,我们能否直接将数字反转后再与反转前的数字进行比较呢,如果相等,那它就是一个回文数,但是反转后的数字如果过大,就会有溢出的问题


那么,能否只反转一半呢?例如1221,将后半部分的21反转为12,然后与前半部分12进行比较,二者相同,即是回文数。

对于一些临界的情况,我们要首先排除,就如同方法一中的,小于0的数,除0之外个位数是0的数都不可能是回文数

根据以上的描述,我们来举个例:

就以1221为例,执行1221 % 10 = 1,得到最后一位数字1,要得到倒数第二位,则可以先除以10,即1221 / 10 = 122,再继续上一步122 % 10即可得到倒数第二位2,接着最后一位乘以10,再加上倒数第二位,即1 * 10 + 2 = 12,以此类推

关键是我们怎么知道反转的数字已经到达了一半呢?其实我们在处理的过程中,不断地将原始数字除以10后再将反转后的数字乘以10,因此当原始数字小于或等于反转后的数字时,就说明我们已经处理了一半的数字了。

而对于数字位数是奇数时,我们怎么办呢?其实也很简单,因为中间那一位数字其实我们是不用去比较的,那直接除以10,再去比较即可

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值