持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第2天,点击查看活动详情
一、题目描述:
9. 回文数 - 力扣(LeetCode) (leetcode-cn.com)
给你一个整数 x ,如果 x 是一个回文整数,返回 true ;否则,返回 false 。
回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。
例如,121 是回文,而 123 不是。
示例 1:
输入: x = 121
输出: true
示例 2:
输入: x = -121
输出: false
解释: 从左向右读, 为 -121 。 从右向左读, 为 121- 。因此它不是一个回文数。
示例 3:
输入: x = 10
输出: false
解释: 从右向左读, 为 01 。因此它不是一个回文数。
提示:
-2^31 <= x <= 2^31 - 1
进阶: 你能不将整数转为字符串来解决这个问题吗?
二、思路分析:
方法一:将整数类型转化为字符串 t ,然后反转 t 得到 t2, 比较 t2 == t
class Solution {
public:
bool isPalindrome(int x) {
//当 x 为负数时,由于负号的存在,因此一定不是回文
if( x < 0)
return false;
string compare = to_string( x);
reverse( compare.begin(), compare.end());
return to_string(x) == compare;
}
};
方法二:由于转化字符串耗时且耗空间,我们寻找一个不需要转化为字符串的方法。
关键点:对于整数类型,如果该整数是回文数,这意味着这个整数即使反转也不会溢出。
有了上述要点,我们可以设置变量 compare, 它存储原数字反转后的数字,然后将二者比较即可。
class Solution {
public:
bool isPalindrome(int x) {
//当 x 为负数时,由于负号的存在,因此一定不是回文
if( x < 0)
return false;
long compare = 0;
int temp = x;
while( temp)
compare = compare * 10 + temp % 10, temp /= 10;
return compare == x;
}
};
方法三:翻转一半数字,然后比较翻转后的数字和剩下的数字是否相等。
class Solution {
public:
bool isPalindrome(int x) {
//当 x 为负数时,由于负号的存在,因此一定不是回文
//当 x 不为 0, 且最后一位为0, 则一定不是回文
if( x < 0 ||( x!= 0 && x%10 == 0))
return false;
int compare = 0;
while( x > compare)
compare = compare * 10 + x % 10, x/=10;
return (compare == x) || (compare / 10 == x); //compare/10 是考虑了奇数位数的情况
}
};