题目: Palindrome Number
描述:Determine whether an integer is a palindrome.An integer is apalindrome when it reads the same backward as forward.
示例:
Example 1:
Input: 121
Output: true
Example 2:
Input: -121
Output: false
Explanation: From left to right, it reads -121. From right to left, it becomes 121-. Therefore it is not a palindrome.
Example 3:
Input: 10
Output: false
Explanation: Reads 01 from right to left. Therefore it is not a palindrome.
Follow up:
提示:
Coud you solve it without converting the integer to a string?
来源:力扣(LeetCode)
分析:题目大意就是叫你写个程序,判断整数回文数。回文数,学过编程应该都多少了解,就是一串数字,正着读和倒着读都一样。这没什么好说的了。
解法一:将数字反转,判断前后是否相等
定义long变量,最后结果转型为int。也是比较直接的解法,当然,这个算法并不是很好,因为容易碰到整型溢出的问题,所以并不推荐,仅供参考学习。
Java代码:
/** * 解法一:将数字反转,判断前后是否相等 * @param x * @return */
public static int reverse(int x){
long n=0;
while (x!=0){
n = n*10+x%10;
x = x/10;
}
return (int)n;
}
解法二:先转为字符串,再进行判断。
/** * 解法三:转为字符串处理 * @param x * @return */
public boolean isPalindrome2(int x) {
String reversedStr = (new StringBuilder(x + "")).reverse().toString();
return (x + "").equals(reversedStr);
}
解法三:对前一半与后一半的数字进行比较,相等即可证明为回文数。
算法详解:认真观察,回文数是有一定规律特征可循的,比如,与其知道什么是回文数,何不如反过来问,什么样的数不是回文数?
1.负数不可能为回文数。
因为一个数符号总是在高位前面,最低位之后不可能再有正负号,因此前后并不满足相等的情况。
2.数字末位为0的不可能是回文数:
因为如果满足条件,那么高位也必须为0,显然这个条件不成立,当然,就一位数的情况另当别论,这种情况一定是回文没错了。二者并不冲突,仔细思考便知!
那么如何取到数字前半段与后半段进行比较判断,方法其实和之前的题目:leetcode7.ReverseInteger(整数反转)类似,可以通过取余和作除的方法获取到各位数字后进行后续判断。
那么问题来了,我们如何知道反转数字的位数已经达到原始数字位数的一半?
由于整个过程我们不断将原始数字除以 10,然后给反转后的数字乘上 10,所以,当原始数字小于或等于反转后的数字时,就意味着我们已经处理了一半位数的数字了。(那些说不理解的,请认真思考一下,就是一个简单的数学逻辑,并不困难!)
/** * 解法二:前后对半比较 * @param x * @return */
public static boolean isPalindrome1(int x){
if (x<0 ||( x % 10 == 0 && x!=0)){
return false;
}
int reverNumber = 0;
while (x>reverNumber){
reverNumber = reverNumber*10+x%10;
x/=10;
}
//分为奇数,偶数情况比较,如果是前者,直接去掉处于中间的中位数再比较。
return x==reverNumber||x==reverNumber/10;
}
当然,这也是leetcode的官方解法之一,如果还想看更详细的分析,请移步leetcode官网。我是官网传送门
补:解法三复杂度:
时间复杂度:O(log10^(n))
空间复杂度:O(1)