【LeetCode】 第九题 回文数 isPalindrome

题目

判断一个整数是否是回文数。回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。

示例

示例1

输入: 121 
输出: true

示例2

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

示例3

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

分析 

这个实际上和第七题有很大的相似之处,判断是否为回文数就是把这个数首先翻转过来,判断翻转后的数字和原来的数字是否相等,观察发现只要是输入负数,那么一定不会是回文数。对于非负数而言,如果直接采用第七题的方法,需要考虑溢出的问题,也就是如果翻转后的数字大于Integer.MAX_VALUE。所以可以对一半进行翻转,如果该数字是回文,其后半部分反转后应该与原始数字的前半部分相同。这样处理不仅可以解决溢出问题,还可以缩短翻转的位数。

那么如何判断反转数字的位数是否已经达到原始数字位数的一半?每次通过对10取余,取出最低位的数字,然后加到取出数的末尾,就是将revertNum乘以10,再加上这个余数,这样我们的翻转也就同时完成了,每取一个最低位数字,x都要自除以10。这样当revertNum大于等于x的时候循环停止。

代码实现

public class Palindrome_2 {
	
	public boolean isPalindrome(int x) {
		int temp = x;
		int res = 0;
		if(x < 0) {
			return false;
		}else {
			while(temp > res) {
				res = res * 10 + temp % 10;
				temp = temp /10;
			}
			//如果是奇数的话,那么最中间的数字就在res的最低位上了,我们除以10以后应该和x是相等的
			return x == res || x == res / 10;
		}
    }
	
	public static void main(String[] args) {
		Palindrome_2 pal = new Palindrome_2();
		System.out.println(pal.isPalindrome(-121));
	}
}

字符串实现 

可以将该数字转换成字符串进行判断,这样思路会简单一点。将字符串与翻转过来的字符串进行比较,这样也不用担心溢出问题:

public class Palindrome_1 {
	
	public boolean isPalindrome(int x) {
		
		if( x < 0 ) {
			return false;
		} else {
	        //将int类型的数转换成字符串
			StringBuffer x1 = new StringBuffer(String.valueOf(x));
			x1.reverse();
			String s = x1.toString();
			String s1 = new String(String.valueOf(x));
			if(s.equals(s1)) //不能用“==”
				return true;
			else
				return false;
		}
    }
	
	public static void main(String[] args) {
		Palindrome_1 pal = new Palindrome_1();
		System.out.println(pal.isPalindrome(121221));
	}

}

发布了169 篇原创文章 · 获赞 101 · 访问量 7万+

猜你喜欢

转载自blog.csdn.net/zzu_seu/article/details/100834518