LeetCode——回文数

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——回文数_第1张图片
方法一的LeetCode测试:
在这里插入图片描述
方法二的LeetCode测试:
在这里插入图片描述

你可能感兴趣的:(LeetCode,算法题,leetcode,字符串,算法,java)