LeetCode-9-回文数
题意描述:
判断一个整数是否是回文数。回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。
进阶: 你能不将整数转为字符串来解决这个问题吗?
示例:
示例1:
输入: 121
输出: true
示例2:
输入: -121
输出: false
解释: 从左向右读, 为 -121 。 从右向左读, 为 121- 。因此它不是一个回文数。
示例3:
输入: 10
输出: false
解释: 从右向左读, 为 01 。因此它不是一个回文数。
解题思路:
Alice: 这题咱做过啊,字符串反转一下就得了,用Python写顶多三行代码。
Bob: O(∩_∩)O哈哈~
Alice: 你笑什么?
Bob: 我们受过专业的训练…进阶的那里写着不要用字符串。
Alice: 你是已经有解法了是吗?
Bob: 两种!!第一种就是直接构造一个反转后的数,然后判断两个数字是否相等。第二种就是按位比较,如果对应的位上有不相等的就不是回文数,如果都没有就是回文数。
Alice: 第一种很好写,第二中看起来挺好,但我觉得没必要,大材小用,能用简单的方法为什么要用复杂的方法呢?
Bob: (〃‘▽’〃) 因为,,万一面试的时候问你还有没有别的解法呢!!
Alice:(〃‘▽’〃) 。。。
代码:
Python方法一:转换为字符串后,反转字符串然后判别两个字符串是否相等。
class Solution:
def isPalindrome(self, x: int) -> bool:
originStr = str(x)
reversedStr = "".join([z for z in str(x)][::-1])
return originStr == reversedStr
Python方法二: 通过组合一个反转后的数字来比较两个数字是否相等。
class Solution:
def isPalindrome(self, x: int) -> bool:
if x < 0:
return False
elif x == 0:
return True
else:
tmpx = x
reversedx = 0
while tmpx:
reversedx = reversedx * 10 + (tmpx % 10)
tmpx = tmpx // 10
return x == reversedx
C++ 方法二:
class Solution {
public:
bool isPalindrome(int x) {
if(x < 0){
return false;
}else if(x == 0){
return true;
}else{
long tmpx = x;
long reversedx = 0;
while(x){
reversedx = reversedx * 10 + x % 10;
x /= 10;
}
return tmpx == reversedx;
}
}
};
Java 方法三,直接按位判断首位和末尾的数字是否相等。需要不断的去除首位和末尾的数字,代码上有点麻烦,而且会被针对很多小细节,比如说1000021这种测试样例。而且需要先整除一遍获得整个数字的位数,这样速度上也不快了,唯一的优势可能就是不用使用长整型吧。总体上不是很推荐这种解法。
class Solution {
public boolean isPalindrome(int x) {
if(x < 0){
return false;
}else if(x == 0){
return true;
}else{
int pre;
int after;
int tmpx = x;
int cnt = 0;
while(tmpx != 0){
tmpx /= 10;
cnt ++;
}
//System.out.println(cnt);
tmpx = x;
while(x != 0){
if(x < 10){
if(cnt == 1){ // 针对 100021这种中间有零的数据
return true;
}else{
return false;
}
}
after = x % 10;
pre = x / (int)(Math.pow(10.0, (double)(--cnt)));
//System.out.println(tmpx +" pre " + pre + " after " + after);
if(pre != after){
return false;
}
x /= 10;
x -= (int)(Math.pow(10.0, (double)(--cnt))) * pre;
//System.out.println(cnt);
}
}
return true; // 必须是true,针对 1221 这种位数是偶数的数据
}
}
易错点:
- Python3中整除符号是
//
而不是/
。 - 负数是没有回文数的。
- 输入中有
2^31-1
反转后的数字使用整型存储会溢出。
总结:
- 玉不琢,不成器。