LeetCode——回文数
题目描述:
判断一个整数是否是回文数。回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。
示例 1:
输入: 121
输出: true
示例 2:
输入: -121
输出: false
解释: 从左向右读, 为 -121 。 从右向左读, 为 121- 。因此它不是一个回文数。
示例 3:
输入: 10
输出: false
解释: 从右向左读, 为 01 。因此它不是一个回文数。
进阶:
你能不将整数转为字符串来解决这个问题吗
解题思路:
首先我们对回文数进行分析,可以看到负数或者最后一位为零的非零数一定不是回文数,因此可以在开头就先进行判断,如果满足上述条件直接return false。
这里用了两个方法:
方法一:把该数字转换为字符串,再存储在字符数组中,并检查前一半的数组是否与后一半的相同,但是这个方法需要另外开辟数组空间。
方法二:思路是把该数字本身反转,但是这就有可能导致反转后的数字溢出。,有关反转后溢出的问题可以参考另一篇文章LeetCode——数字反转
为了避免溢出问题,我们可以考虑只反转数字的一半,即获得该数字的后半段,通过将后半段与前半段进行比较可以判断该数是不是回文数。
我们将后半段的数字设为result,num变为前半段,循环至result大于或等于num时结束。
位数为偶数时:例如:1221
循环后result = 12,num = 12
则result = num ,该数字是回文数。
位数为奇数时:例如:12321
循环后result = 123 ,num = 12
则 num = result / 10 ,该数字是回文数。
总结就是:
result = num 或者 num == result / 10,该数字就是回文数。
方法一和方法二的代码如下:
package LeetCode.isPalindrome;
/*
判断一个整数是否是回文数。回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。
示例 1:
输入: 121
输出: true
示例 2:
输入: -121
输出: false
解释: 从左向右读, 为 -121 。 从右向左读, 为 121- 。因此它不是一个回文数。
示例 3:
输入: 10
输出: false
解释: 从右向左读, 为 01 。因此它不是一个回文数。
进阶:
你能不将整数转为字符串来解决这个问题吗
*/
public class isPalindromeSolution {
//方法一
public static Boolean solution1(int num){
if(num < 0 || (num % 10 == 0 && num != 0)){//如果是负数一定不是回文数,如果最后一位是0且该数不是0则也不是回文数
return false;
}
String s = String.valueOf(num);
char c[] = s.toCharArray();//将数字每一个位数放到数组里
for (int i = 0; i < c.length / 2; i++) {
if(c[i] != c[c.length -1 - i]){//判断是否和对应的位置上的数相同
return false;
}
}
return true;
}
//方法二
public static Boolean solution2(int num){
if(num < 0 || (num % 10 == 0 && num != 0)){
return false;
}
int result = 0;//存储数字的后半段
while(result < num){//数字的后半段大于或等于前半段时跳出循环
result = result * 10 + num % 10;
num /= 10;
}
//当后半段等于前半段,或者后半段去掉最后一位后等于前半段时满足回文数的定义
if((result == num) || (num == result / 10)){
return true;
}else{
return false;
}
}
}
main方法如下:
package LeetCode.isPalindrome;
import java.util.Scanner;
public class isPalindromeMain {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
System.out.println("输入数字:");
int num = scan.nextInt();
boolean b = isPalindromeSolution.solution1(num);
System.out.println("方法一:");
if(b){
System.out.println("是回文数");
}else{
System.out.println("不是回文数");
}
boolean c = isPalindromeSolution.solution2(num);
System.out.println("方法二:");
if(c){
System.out.println("是回文数");
}else{
System.out.println("不是回文数");
}
}
}
运行结果如下:
方法一的LeetCode测试:
方法二的LeetCode测试: