9-回文数
@Author:CSU张扬
@Email:csuzhangyang@gmail.com or csuzhangyang@qq.com
1. 题目
判断一个整数是否是回文数。回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。
示例 1:
输入: 121
输出: true
示例 2:
输入: -121
输出: false
解释: 从左向右读, 为 -121 。 从右向左读, 为 121- 。因此它不是一个回文数。
示例 3:
输入: 10
输出: false
解释: 从右向左读, 为 01 。因此它不是一个回文数。
进阶:
你能不将整数转为字符串来解决这个问题吗?
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/palindrome-number
2. 解法
2.1 解法一
-
我们将该数字翻转得到的数字和原数字相等,此时它就是回文数。
-
考虑翻转后会溢出的问题,我们设置翻转后的数字设置为long类型即可。
-
当然2中方法并不适用所有情况,我们可以使用以下方法判断.
if (reverse > INT_MAX / 10 || (reverse >= INT_MAX && (temp % 10) > 7)) return false;
执行用时: 4 ms, 在所有 cpp 提交中击败了99.52%的用户
内存消耗: 7.9 MB, 在所有 cpp 提交中击败了95.45%的用户
class Solution {
public:
bool isPalindrome(int x) {
if (x < 0)
return false;
int temp = x;
long reverse = 0;
while (temp) {
reverse = reverse * 10 + temp % 10;
temp = temp / 10;
}
return (reverse == x);
}
};
2.2 解法二
- 我们没有必要将整个数字翻转,只需要将后一半数字反转,再与前一半的数字相比较即可。
- 例如1234321,后一半的数是321,翻转得到123,前一半的数是123,两者相等,则是回文数。
需要注意奇回文数和偶回文数的处理。
执行用时: 16 ms, 在所有 cpp 提交中击败了75.83%的用户
内存消耗: 8.1 MB, 在所有 cpp 提交中击败了82.64%的用户
class Solution {
public:
bool isPalindrome(int x) {
int digit = 0;
if (x < 0)
return false;
int temp = x;
while (temp) {
temp = temp /10;
digit ++;
}
int left = 0, right = 0;
left = x / pow(10, (digit + 1) / 2);
for (auto i = 0; i < digit / 2; ++ i) {
right = right * 10 + x % 10;
x = x / 10;
}
return (left == right ? true : false);
}
};