力扣-9-回文数

抛开空间复杂度O(N)的解法(转字符串),要想O(1),还是反转的思想
确切地说,是造一个长度为原数字位数一半各位数与原数字反转的数

例如:原数字1234,要构造的就是43
原数字123,要构造的就是32

  1. 怎么取各位数字呢?答案是“%”与“/”操作的组合

这里要注意的一点是,因为两个运算操作都是对10操作,那么10的倍数必须特殊处理
比如:原数字1000,在代码条件中会一直循环(因为反转后的数字始终为0)直到等于1,结果是11,返回true
这里还要特别
额外处理“0”的情况==

  1. 怎么判断到没到一半?答案是原数字剩下的部分小于反转数字的时候

对于单数长度,反转数字一定会多一位时
对于双数长度可能多一位,也可能同位

class Solution {
public:
bool isPalindrome(int x) {
if (x < 0|| (x!=0&&x % 10 == 0)) return false;
// 这个情况被下面包含了
// if (x < 10) return true;
int reverse = 0;
// 这个条件是判断反转到一半了
while (x > reverse) {
reverse = reverse * 10 + x % 10;
x /= 10;
}
// 后一个条件是为了处理数字位数是单数的情况
// 考虑前两位大于后两位的反转的情况…
if (x == reverse||x==reverse/10) return true;
else return false;
}
};

想一想3412这个例子,反转后分别为:3和214
…感觉越想越复杂了

本文作者:YaosGHC

本文链接:https://www.cnblogs.com/yaocy/p/16662515.html

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @   YaosGHC  阅读(15)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示
💬
评论
📌
收藏
💗
关注
👍
推荐
🚀
回顶
收起