LeetCode算法9:java 回文数

版权声明:可以转载,请注明链接出处 https://blog.csdn.net/xihuanyuye/article/details/85123704

1、题目
判断一个整数是否是回文数。回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。
示例 1:

输入: 121
输出: true

示例 2:
输入: -121
输出: false
解释: 从左向右读, 为 -121 。 从右向左读, 为 121- 。因此它不是一个回文数。

示例 3:
输入: 10
输出: false
解释: 从右向左读, 为 01 。因此它不是一个回文数。

2、思路:
这个问题比较讲究数学思维,并且对于特殊情况需要考虑周到。
思路如下:
1、第一反应就是将整数转换为字符串,然后检查字符串是否是回文。但创建字符串需要O(n)的(非常量)空间,这与题目的要求是不符合的。

2、第二个想法是,将整数本身逆序,然后将逆序后的整数和原来的整数进行比较。如果它们相同,那么一定是回文数。但是,需要注意的是,逆序后的数字可能>int.Max。这会导致溢出。

3、为了避免产生溢出问题,我们可以只逆序整数的一半。回文数的后半部分的逆序应该和回文数的前半部分相同。

举个例子,如果输入的是“1221”,我们可以将“1221”的后半部分从“21”逆序为“12”,并与“1221”的前半部分进行比较。

如果相同,那么就是一个回文数。

对于整数“1221”,通过“1221%10”,我们就可以得到最后一位“1”。可以把“1221/10 =122”,再“122%10”,我们就可以得到倒数第二位了。

重复这样的过程,直到这个整数的中间位置。但是对于“12321“的情况也要最终考虑周全。

4、现在问题的关键是,我们如何知道,我们已经到了这个整数的中间位置了。
当逆序后的数的值大于原来的值的时候,就到了这个整数的中间位置了!

3、代码

package _01_50;

public class _09PalindromeNumber{

	public boolean isPalindrome(int num){
		//special scene
		if(num<0||((num%10==0)&&num!=0)) return false;
		
		int revert = 0;
		while(true){
			revert = revert*10 + num%10;
			num = num/10;	
			if(revert>=num) break;
			}
		if(revert == num){
			return true;
		}else if(revert/10 == num){
			return true;
			}return false;
	}

	public static void main(String[] arg){
		_09PalindromeNumber PalindromeNumber = new _09PalindromeNumber();
		int a = 121;
		int b = 1221;
		int c = 1234321;
		int d = 123321;
		int e = 1;
		int f = 12;
		System.out.println(PalindromeNumber.isPalindrome(a));
		System.out.println(PalindromeNumber.isPalindrome(b));
		System.out.println(PalindromeNumber.isPalindrome(c));
		System.out.println(PalindromeNumber.isPalindrome(d));
		System.out.println(PalindromeNumber.isPalindrome(e));
		System.out.println(PalindromeNumber.isPalindrome(f));
		}
}

参考:
LeetCode 9. 回文数

猜你喜欢

转载自blog.csdn.net/xihuanyuye/article/details/85123704