leetcode - [9] 回文数|刷题打卡

367 阅读2分钟

leetcode - [9] 回文数|刷题打卡

​ 我是通过idea的leetcode插件获取题目做题的,所以题目描述基本都会有注释符号哈

1. 题目描述

//给你一个整数 x ,如果 x 是一个回文整数,返回 true ;否则,返回 false 。 
//
// 回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。例如,121 是回文,而 123 不是。 
//
// 示例 1: 
// 
//输入:x = 121
//输出:true
//
// 示例 2: 
// 
//输入:x = -121
//输出:false
//解释:从左向右读, 为 -121 。 从右向左读, 为 121- 。因此它不是一个回文数。
//
// 示例 3: 
// 
//输入:x = 10
//输出:false
//解释:从右向左读, 为 01 。因此它不是一个回文数。
//
// 示例 4: 
// 
//输入:x = -101
//输出:false
// 
//
// 提示: 
// 
// -231 <= x <= 231 - 1 
//
// 进阶:你能不将整数转为字符串来解决这个问题吗? 
// Related Topics 数学 

2. 思路分析

​ 这道题目看到的时候会两个思路:

  1. 直接作为数字来处理
    1. 先判断是否>0,小于0都不用考虑了
    2. 大于0的话我们构造一个与原有数字相反的数字
    3. 比较两个数字是否一致
  2. 转成字符串比对
    1. 先判断是否>0,小于0都不用考虑了
    2. 获取到字符串的长度,我们需要取中间值作为判断值(注意长度奇数偶数是否会有影响)
    3. 用 String.chatAt() 方法判断头尾是否相同

3. AC代码

public class No9 {
    public boolean isPalindrome(int x) {
        // 粗暴方法
//        return simple(x);
        // 转字符串
        return trans2Str(x);
        // 网上答案
//        return isPalindrome1(x);
    }

    /**
     * 转字符串后处理
     * 根据字符串长度,对半处理
     *
     * 执行耗时:10 ms,击败了76.11% 的Java用户
     * 内存消耗:37.8 MB,击败了66.98% 的Java用户
     *
     * @param x
     * @return
     */
    private boolean trans2Str(int x) {
        boolean re = false;
        // 大于0不用考虑
        if (x < 0)  return re;
        String str = String.valueOf(x);
        int strLen = str.length();

        int head =  0;
        int tail = strLen - 1;

        int flag = strLen/2;

        // 感觉每次判断的 < <= > >= 都要好好思考一波
        while (head < flag) {
            if(str.charAt(head) != str.charAt(tail)) {
                return re;
            }
            // 头尾都往中间靠拢
            head++;
            tail--;
        }
        re = true;

        return re;
    }

    /**
     * 直接取值,构造一个反转值,然后再比对
     *
     * 执行耗时:11 ms,击败了50.09% 的Java用户
     * 内存消耗:37.9 MB,击败了45.56% 的Java用户
     *
     * @param x
     * @return
     */
    private boolean simple(int x) {
        boolean re = false;
        // 小于0,不用考虑
        if (x >= 0) {
            boolean flag = true;
            int y = 0;
            int tmp = Integer.valueOf(x);
            // 构造一个反转过来的数
            while (flag) {
                y = y * 10 + tmp % 10;
                tmp = tmp / 10;
                // 判断结束条件
                flag = tmp != 0 ? true : false;
            }
            re = y == x;
        }
        return re;
    }

    /**
     * 网上大佬的做法,时间快了1ms
     *
     * 执行耗时:9 ms,击败了99.12% 的Java用户
     * 内存消耗:38 MB,击败了28.05% 的Java用户
     *
     * @param x
     * @return
     */
    public boolean isPalindrome1(int x) {
        if(x < 0)
            return false;
        int cur = 0;
        int num = x;
        while(num != 0) {
            cur = cur * 10 + num % 10;
            num /= 10;
        }
        return cur == x;
    }
}

4. 总结

​ 这道题给我的想法是对于一些临界值的判断条件,要特别注意给到精确的判断条件以及判断值。


​ 本文正在参与「掘金 2021 春招闯关活动」, 点击查看 活动详情