描述
判断一个正整数是不是回文数。回文数的定义是,将这个数反转之后,得到的数仍然是同一个数。
例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,再去比较即可