力扣-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
…感觉越想越复杂了

posted @ 2022-09-06 17:05  YaosGHC  阅读(20)  评论(0)    收藏  举报