题目:
9-判断一个整数是否是回文数。回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。
示例 1:
输入 : 121
输出 : true
示例 2 :
输入 : -121
输出 : false
解释 : 从左向右读, 为 - 121 。 从右向左读, 为 121 - 。因此它不是一个回文数。
示例 3 :
输入 : 10
输出 : false
解释 : 从右向左读, 为 01 。因此它不是一个回文数。
进阶 :
你能不将整数转为字符串来解决这个问题吗?
解答:
方法一
依次/10得到每位数字,然后放到容器中,遍历比较
负数不可能为回文数
小于10的直接返回true
bool isPalindrome(int x) { if (x < 0) return false; //负数不可能滴 else if (x < 10) return true; vector<char> vec; while (x > 0) { vec.push_back(x % 10); x = x / 10; } for (int i = 0; i < vec.size()/2; i++) { if (vec[i] != vec[vec.size() - i - 1]) { return false; } } return true; }
效率较差,且占用内存较多
改进一:
将依次得到的个位数倒序组成一个新的int,例如:12321,从右侧得到的数字依次组成123xx,最后判断是否与原输入相等。注意:在组成新数字时,需要判断是否溢出。
个位数为零的也不可能是,因为最高位不可能为零。
bool isPalindrome2(int x) { if (x < 0) return false; //负数不可能 else if (x < 10) return true; //个位为零的也不可能是,因为最高位不可能是0 if (x % 10 == 0) return false; int y = 0; int tmp = x; while (tmp > 0) { if (y > INT_MAX / 10)//需要判断是否溢出!!!如果溢出了肯定不是,因为输入数字没溢出 return false; y = y * 10 + tmp % 10; tmp = tmp / 10; } return x == y; }
改进二:
上面的比较次数太多了,可以比较数字长度的一半:
bool isPalindrome3(int x) { if (x < 0) return false; //负数不可能 else if (x < 10) return true; //个位为零的也不可能是,因为最高位不可能是0 if (x % 10 == 0) return false; int y = 0; while (x > 0) { if (y > INT_MAX / 10)//需要判断是否溢出!!!如果溢出了肯定不是,因为输入数字没溢出 return false; y = y * 10 + x % 10; x = x / 10; if (y == x) return true; else if (y > x) { y /= 10; return x == y; } } return false; }