怒刷力扣(回文数)

124 阅读1分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第2天,点击查看活动详情

回文数

WangScaler: 一个用心创作的作者。

声明:才疏学浅,如有错误,恳请指正。

前因

一是做笔记,记忆是会忘的,以便以后回来复习,加深印象。二是记录自己思想的变化过程吧,可能回头看的时候,会发现自己多么的低级。三是更文激励自己刷下去,提升自己。不进步就是退步。

题目

给你一个整数 x ,如果 x 是一个回文整数,返回 true ;否则,返回 false 。

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

例如,121 是回文,而 123 不是。

分析

初步思考

从后往前遍历一半元素的字符串和前一半的字符串对比。如果一样则是回文数,如果不一样则不是回文数。

 public static boolean isPalindrome(int x) {
        String xToString = String.valueOf(x);
        StringBuffer stringBuffer = new StringBuffer();
        if (xToString.length() % 2 == 0) {
            for (int i = 0; i < xToString.length() / 2; i++) {
                stringBuffer.append(xToString.substring(xToString.length() - 1 - i, xToString.length() - i));
            }
            xToString = xToString.substring(0,xToString.length()/2);
        } else {
            for (int i = 0; i < (xToString.length() - 1) / 2; i++) {
                stringBuffer.append(xToString.substring(xToString.length() - 1 - i, xToString.length() - i));
            }
            xToString = xToString.substring(0,(xToString.length()-1)/2);
        }
​
        if (xToString.equals(stringBuffer.toString())) {
            return true;
        }
        return false;
    }

继续思考

看似没什么问题,但是 题目有一句话,让我一愣。进阶:你能不将整数转为字符串来解决这个问题吗? 果然我想到的就是最低级的做法,人家早就料到了。

那么怎么用数字来解决这个问题呢?用数字的话,那么怎么能得到两段数字呢?

无论是拆分数字还是提取数字,少不了遍历,这样的话最方便的还是上边的转换成数字,肯定是行不通的。

既然是数字,那么肯定是可以运算的,那么怎么运算能得到两段数字呢?

我们知道整数对十取余正好可以得到最后一个数字。整数除十就是前边的数字。

比如我们计算12321是不是回文数,只需要

  • 12321%10=1;12321/10=1232
  • 1232%10=2;1232/10=123;
  • 123/10=12

只需要拿着剩下的12和1*10+2进行比较即可。

答案

public static boolean isPalindrome(int x) {
        if (x < 0 || x % 10 == 0) {
            return false;
        }
        int length = 0;
        while (x > length) {
            length = length * 10 + x % 10;
            x /= 10;
        }
        if (length == x || x / 10 == length) {
            return true;
        }
        return false;
    }

复杂度

  • 时间复杂度:O(logn)。每次迭代除以10。
  • 空间复杂度:O(1)。我们只需要常数length存放尾数部分的值。

总结

每次最开始想到的好像都是最低级的解法,然后再这个基础上继续思考,才能想出点好的解法。这还都是刷的简单的算法,天天进步吧。兄弟们,加入算法大军,一块进步吧。

都来了,点个赞再走呗!

关注WangScaler,祝你升职、加薪、不提桶!