2021.05.11 算法题:回文数

题目来源:力扣(LeetCode

链接:https://leetcode-cn.com/problems/palindrome-number

难度:简单

题目描述

给你一个整数 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

第一次提交

看完这个题,特别是用例和结果,我发现和昨天分享的那中解法,刚好也可以用到这里,所以很多,我有了第一种解法:

class Solution {
    public boolean isPalindrome(int x) {
            if (x < 0) {
                return false;
            }
            int n = 0;
            int temp = x;
            while (x != 0) {
                n = n * 10 + x % 10;
                x = x / 10;
            }
            return n == temp;
        }
}

从提交结果来看,还是挺不错的。我们来简单说下思路,根据题目描述,回文数特点有一下几点:

  • 正序和反序(反转)数值一样
  • 负数都不是回文数

所以第一种解法就是将目标数反转,先判断是否为负数,负数直接返回false,然后计算目标数值的反转数,比较反转前和反转后是否一致,一致就是回文数,否则就不是

第二次提交

其实,第二次可能是大部分人的思路(包括我),如果不是刚做完整数反转,那我可能也这么做了:

class Solution {
    public boolean isPalindrome(int x) {
        if (x < 0) {
            return false;
        }
        boolean isPalindrome = false;
        String xStr = String.valueOf(x);
        char[] chars = xStr.toCharArray();
        for (int i = 0; i <= chars.length / 2; i++) {
            isPalindrome = (chars[i] == chars[chars.length -1 -i]);
            if (!isPalindrome) {
                return isPalindrome;
            }
        }
        return isPalindrome;
    }
}

提交结果和第一次差不多,但是时间上比第一次长了一点。这里的思路就很简单了,就是挨个比较,比较数字长度的一半就可以:

简单优化

把上面的代码做了一些简单的优化修改,内存消耗方面有了较大的提升:

class Solution {
    public boolean isPalindrome(int x) {
        if (x < 0) {
            return false;
        }
        char[] chars = String.valueOf(x).toCharArray();
        for (int i = 0; i <= chars.length / 2; i++) {
            if (!(chars[i] == chars[chars.length -1 -i])) {
                return false;
            }
        }
        return true;
    }
}

当然如果从代码的可读性上讲,第一种会比第二种更好,但是算法往往是考虑性能的是,所以如果单纯从算法角度来说,第二种更好。

总结

算法问题永远不会是唯一解,解决问题的关键在于你要有正确的解题思路,而思路的建立又依托于你对问题的建模能力(抽象化思维),建模能力又是靠不断地解决问题积累的,总结下就是算法考察的是你的逻辑思维(数学能力)和抽象化思维(实际问题抽象成模型,将问题与模型匹配,选择更合适的模型),看你是否可以将这两者很好的结合,写出最优解,毕竟日常工作中,一切业务逻辑本质上都是算法,一切业务逻辑的实现过程就是建立算法的过程,所以算法能力就是你编程能力的体现。

作为一个开发工程师,算法能力是最基本但特别重要的能力,这个能力和语言、系统、环境无关无关的,但很大程度上决定了你在这个行业能走多远,毕竟大厂对于算法都是有要求的,如果你的算法能力很差,没人会相信你能写出好代码。好了,今天就到这里吧,一定要坚持学习哦!

项目路径:

https://github.com/Syske/example-everyday

本项目会每日更新,让我们一起学习,一起进步,遇见更好的自己,加油呀

原文地址:https://www.cnblogs.com/caoleiCoding/p/14758265.html