zoukankan      html  css  js  c++  java
  • LeetCode--9.回文数(简单)

    题目描述:

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

    示例 1:

    输入: 121

    输出: true

    示例 2:

    输入: -121

    输出: false

    解释: 从左向右读, 为 -121 。 从右向左读, 为 121- 。因此它不是一个回文数。

    示例 3:

    输入: 10

    输出: false

    解释: 从右向左读, 为 01 。因此它不是一个回文数。

    进阶:

    你能不将整数转为字符串来解决这个问题吗?

    方法一:反转一半数字

     思路

    • 第一个想法是将数字转换为字符串,并检查字符串是否为回文。但是,这需要额外的非常量空间来创建问题描述中所不允许的字符串。
    • 第二个想法是将数字本身反转,然后将反转后的数字与原始数字进行比较,如果它们是相同的,那么这个数字就是回文。但是,如果反转后的数字大于 int.MAX,我们将遇到整数溢出问题。

      按照第二个想法,为了避免数字反转可能导致的溢出问题,为什么不考虑只反转int数字的一半?毕竟,如果该数字是回文,其后半部分反转后应该与原始数字的前半部分相同。

      例如,输入 1221 ,我们可以将数字“1221”的后半部分从“21”反转为“12”,并将其与前半部分“12”进行比较,因为二者相同,我们得知数字 1221 是回文。

    1. 首先,我们应该处理一些临界情况。所有负数都不可能是回文,例如:-123不是回文,因为-不等于3。所以我们可以对所有负数返回false。
    2. 现在,让我们来考虑如何反转后半部分的数字。
    3. 对于数字1221,如果执行1221%10,我们将得到最后一位数字1,要得到倒数第二位数字,我们可以先通过除以10把最后一位数字从1221中移除,1221/10=122,再求出上一步结果除以10的余数,122%10=2,就可以得到倒数第二位数字。
    4. 如果我们把最后一位数字乘以10,再加上倒数第二位数字,1*10+2=12,就得到了我们想要的反转后的数字。如果继续这个过程,我们将得到更多位数的反转数字。
    5. 现在的问题是,我们如何知道反转数字的位数已经达到原始数字位数的一半?
    6. 我们将原始数字除以10,然后给反转后的数字乘上10,所以,当原始数字小于反转后的数字时,就意味着我们已经处理了一半位数的数字。

    关键点

    • 如果是负数,则一定不是回文数
    • 如果是正数,则将其倒序数值计算出来,然后比较和原数值是否相等
    • 如果是回文数则相等:返回true, 如果不是回文数则不相等:返回false
    • 比如123倒序为321,不相等; 121倒序为121,相等;

    代码

    class Solution {
        public boolean isPalindrome(int x) {
            //负数则一定不是回文数,直接返回 false
            if (x < 0) {
                return false;
            }
            int cur = 0;
            int num = x;
            while (num != 0) {
                //得到最后一位数字
                cur = cur * 10 + num % 10;
                //去掉num的个位数
                num /= 10;
            }
            //如果反转后的数字
            return cur == x;
        }
    }

    复杂度

    • 时间复杂度:O(log10(n)),对于每次迭代,我们会将输入除以10,因此时间复杂度为O(log1o(n))。
    • 空间复杂度:O(1)。
  • 相关阅读:
    Python 2 与 python 3的区别
    语法基础题
    Python运算符_ 2018-07-26
    Python 各种语句:2018-07-27
    解决在Python中使用Win32api报错的问题,No module named win32api
    在CenOS7.5里安装Redis
    下载Redis
    重置CentOS6.5的登录口令
    如何在CentOS里切换操作系统所用的语言,中英文切换
    在Ubuntu里安装Mysql5.7.23
  • 原文地址:https://www.cnblogs.com/xiaozhongfeixiang/p/12019221.html
Copyright © 2011-2022 走看看