原题目:
Determine whether an integer is a palindrome. Do this without extra space.
click to show spoilers.
Some hints:
Could negative integers be palindromes? (ie, -1)
If you are thinking of converting the integer to string, note the restriction of using extra space.
You could also try reversing an integer. However, if you have solved the problem "Reverse Integer", you know that the reversed integer might overflow. How would you handle such case?
There is a more generic way of solving this problem.
判断一个整数是否是回文:
需要考虑:
1.判断负数是否是回文?(负数不是回文)2.本题限制不能使用额外的空间,所以不能通过将整数转化为字符串来进行判断3.可以使用翻转整数的方法,但是要确定翻转后的整数是否会超出int的范围
算法分析:
先统计出整数的位数,通过取余和相除来取出整数的第一位和最后一位,通过判断第一位和最后一位是否相等来实现判断是否是回文。
例如,对于整数23432,首先统计位数Index= 5,然后定义两个指针i和j分别指向整数的第一位和最后一位,通过取余,j=2,通过i=23432/10000来取出第一位,依次这样判断,直到整个整数都判断完成。
LeetCode提交源码:
算法1:时间复杂度O(1),空间复杂度O(1),运行时间较小
public boolean isPalindrome(int x){
if(x == 0){
return true;
}
long longnum = x;
if(longnum > Integer.MAX_VALUE || longnum < Integer.MIN_VALUE){
return false;
}
boolean flag = true;
if(x < 0){
//x = x*(-1);
return false;
}
else{
int index = 0;
int indextmp = x;
while(indextmp != 0){
index++;
indextmp = indextmp/10;
}
System.out.println("index= " + index);
int i = 0,j = 0;
while( x != 0){
j = x%10;
i = (int)(x/(Math.pow(10, (index-1))));
System.out.println("i=" + i + ",j=" + j + ",x=" + x);
if(i != j){
flag = false;
break;
}
else{
x = (int)((x - i*Math.pow(10, (index-1))-j)/10);
index = index - 2;
System.out.println("index=" + index + ",x="+x);
if(index == -1){
break;
}
}
}
}
return flag;
}
算法2:时间复杂度O(1),空间复杂度O(1)
public boolean isPalindrome(int x) {
if (x < 0)
return false;
int d = 1; // divisor
while (x / d >= 10)
d *= 10; //d的位数与x的位数相同
while (x > 0) {
int q = x / d; // 取第一位
int r = x % 10; // 取最后一位
if (q != r) //判断是否相等
return false; //不相等直接返回退出
x = x % d / 10; //x与d取余,去除第一位,和10相除,去除最后一位,巧妙!
d /= 100;
}
return true;
}
完整运行程序:
/**************************************************************
* Copyright (c) 2016
* All rights reserved.
* 版 本 号:v1.0
* 题目描述: Palindrome Number
* Determine whether an integer is a palindrome. Do this without extra space.
* 判断一个整数是否是回文:
* 输入描述:请输入一个整数:
* 12344321
* 程序输出: 算法1:输入的整数是否是回文:true
* 算法2:输入的整数是否是回文:true
* 问题分析:1.判断负数是否是回文?(负数不是回文)
* 2.本题限制不能使用额外的空间,所以不能通过将整数转化为字符串来进行判断
* 3.可以使用翻转整数的方法,但是要确定翻转后的整数是否会超出int的范围
* 算法描述:先统计出整数的位数,通过取余和相除来取出整数的第一位和最后一位,通过判断第一位和最后一位是否相等来实现判断是否是回文。
* 例如,对于整数23432,首先统计位数Index= 5,然后定义两个指针i和j分别指向整数的第一位和最后一位,
* 通过取余,j=2,通过i=23432/10000来取出第一位,依次这样判断,直到整个整数都判断完成。
* 完成时间:2016-11-17
***************************************************************/
package org.GuoGuoFighting.LeetCode01;
import java.util.Scanner;
//-2147483648
class SolutionMethod1{
public boolean isPalindrome(int x){
if(x == 0){
return true;
}
long longnum = x;
if(longnum > Integer.MAX_VALUE || longnum < Integer.MIN_VALUE){
return false;
}
boolean flag = true;
if(x < 0){
//x = x*(-1);
return false;
}
else{
int index = 0;
int indextmp = x;
while(indextmp != 0){
index++;
indextmp = indextmp/10;
}
int i = 0,j = 0;
while( x != 0){
j = x%10;
i = (int)(x/(Math.pow(10, (index-1))));
if(i != j){
flag = false;
break;
}
else{
x = (int)((x - i*Math.pow(10, (index-1))-j)/10);
index = index - 2;
if(index == -1){
break;
}
}
}
}
return flag;
}
}
//时间复杂度O(1),空间复杂度O(1)
class SolutionMethod2{
public boolean isPalindrome(int x) {
if (x < 0)
return false;
int d = 1; // divisor
while (x / d >= 10)
d *= 10; //d的位数与x的位数相同
while (x > 0) {
int q = x / d; // 取第一位
int r = x % 10; // 取最后一位
if (q != r) //判断是否相等
return false; //不相等直接返回退出
x = x % d / 10; //x与d取余,去除第一位,和10相除,去除最后一位,巧妙!
d /= 100;
}
return true;
}
}
public class PalindromeNumber {
public static void main(String[] args){
System.out.println("请输入一个整数:");
Scanner scanner = new Scanner(System.in);
int num = scanner.nextInt();
scanner.close();
SolutionMethod1 solution1 = new SolutionMethod1();
System.out.println("算法1:输入的整数是否是回文:" + solution1.isPalindrome(num));
SolutionMethod2 solution2 = new SolutionMethod2();
System.out.println("算法2:输入的整数是否是回文:" + solution2.isPalindrome(num));
}
}
程序运行结果: