力扣 题目09-回文数 心得
-
题目
-
题解
这题很容易想到把整形转换成字符串然后以中间分割 不断延伸至左右比较即可
-
但是进阶里要求我们不用字符串 那么我们应该想一下其他方法
-
观察回文数可以发现 回文数逆向排序后和原本的数 一样 正好在07题学过整数反转拿来用就是(注意:题目要求负数 都不是 而且不要超过int界限)
-
这种方法确实可以 但可以更近一层
-
我们是不是以中心分割开,将整数分成前半部分和后半部分,然后逆向排序前半和后半比较(),不就可以了
-
以12321为例 12是前半 21是后半 12逆向排序后是21和后半相等
-
所以我们可以改成这样写法
-
代码
-
方法1(全部逆向排序)
-
#include<iostream> using namespace std; class Solution { public: bool isPalindrome(int x) { int ti = x; bool huiwen = false; int add = 0; if (x < 0) { return false; } for (int i=0; ti > 0;i++) { int shu = ti % 10; ti = ti / 10; if (add > INT_MAX / 10) { return 0; } add = add * 10 + shu; } if (add == x) { return true; } else { return false; } } }; int main() { Solution p; int aa = 1234567899; bool huiwen=p.isPalindrome(aa); cout << huiwen << endl; }
方法2(前半部分逆向排序)
-
#include<iostream> using namespace std; class Solution { public: bool isPalindrome(int x) { int wei = 0; int ti = x; int qian = 0; int hou = 0; int ping = 0; if (x < 0) {//小于0直接返回0 return 0; } for (; ti > 0; wei++) {//得到x有多少位 ti = ti / 10; } if (wei % 2 == 0) {//判断是奇还是偶 偶数不需要舍弃中间值 奇数需要舍弃 int a=pow(10, wei / 2); qian = x / a; hou = x % a; } else { int a = pow(10, wei / 2); qian = x / (a*10); hou = x % a; } for (int i = 0; i < wei / 2;i++) {//逆向输出前半给ping int qian2 = qian % 10; qian = qian / 10; ping = ping * 10 + qian2; } if (ping == hou) {//判断是否相等 return 1; } return 0; } }; int main() { Solution p; int aa = 1111; bool huiwen=p.isPalindrome(aa); cout << huiwen << endl; }
-
心得