zoukankan      html  css  js  c++  java
  • 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
    

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

  • 相关阅读:
    0428备份
    1
    0416工作备份
    Bootstrap dropdown a标签或者button 点击事件
    禁止Html5在手机上屏幕页面缩放
    查看端口占用情况
    cakephp 中的find的用法
    cakephp 中连接查询多表 或group by
    cakephp 中的in的用法
    php批量下载文件
  • 原文地址:https://www.cnblogs.com/caoleiCoding/p/14758265.html
Copyright © 2011-2022 走看看