• 9:回文数(C++)


    题目地址:https://leetcode-cn.com/problems/palindrome-number/

    题目描述

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

    回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。例如,121 是回文,而 123 不是。

    题目示例

    示例 1:

    输入:x = 121
    输出:true
    示例 2:

    输入:x = -121
    输出:false
    解释:从左向右读, 为 -121 。 从右向左读, 为 121- 。因此它不是一个回文数。
    示例 3:

    输入:x = 10
    输出:false
    解释:从右向左读, 为 01 。因此它不是一个回文数。
    示例 4:

    输入:x = -101
    输出:false

    解题思路

    特殊情况处理:

    • 所有的负数均不是回文数;
    • 个位数为0的数字不是回文数(除数字0本身之外);

    思路1:将数字转换成字符串,并判断字符串是否是回文数即可,这种做法需要额外的空间。

    思路2:反转数字本身,并判断反转之后的数字是否与原数字相等,若相等,则为回文数,但这种做法可能导致溢出,比如数字x>INT_MIN时。

    思路3:对思路2进行改进,只反转数字的一半,其中反转的数字后一半部分与前一半值相同,例如数字1221,将其后半部分的21反转为12,并将其与前半部分12进行比较,因为二者相同,所以数字1221为回文数。如何知道数字的位数已经达到原始数字位数的一半?时间复杂度O(logn),空间复杂度O(1)

    • 数字长度为奇数时,不断将原始数字除以10,然后给反转后的数字乘以10。如12321,此时将反转后数字除以10,当原始数字小于反转数字时,意味着已经处理了一半位数的数字了;
    • 数字长度为偶数时,不断将原始数字除以10,然后给反转后的数字乘以10。如1221,当原始数字等于反转数字时,意味着已经处理了一半位数的数字了;

    程序源码

    思路1

    class Solution {
    public:
        bool isPalindrome(int x) {
            if(x < 0) return false;
            string s = to_string(x);
            string temp = s;
            std::reverse(temp.begin(), temp.end());
            if(temp == s) return true;
            else 
                return false;
            return true;
        }
    };

    思路2

    class Solution {
    public:
        bool isPalindrome(int x) {
            if(x < 0 || (x % 10 == 0 && x != 0)) return false; //临界条件
            int reverseNumber = 0;
            while(x > reverseNumber)
            {
                reverseNumber = reverseNumber * 10 + x % 10; //反转后的数字计算
                x /= 10;
            }
            //当数字长度x的位数为奇数时,我们可以通过reverseNumber / 10将中间那位数去除
            //例当输入为 12321 时,在 while 循环的末尾我们可以得到 x = 12,revertedNumber = 123
            //由于处于中位的数字不影响回文(它总是与自己相等),所以我们可以简单地将其去除。
            return x == reverseNumber || x == reverseNumber / 10;
        }
    };

    参考文章

    https://leetcode-cn.com/problems/palindrome-number/solution/hui-wen-shu-by-leetcode-solution/

    ----------------------------------- 心之所向,素履所往;生如逆旅,一苇以航。 ------------------------------------------
  • 相关阅读:
    03 Linux下运行Django项目
    02 Linux常用基本命令(二)
    01 Linux常用基本命令(一)
    08 基本数据结构
    07 Deque的应用案例-回文检查
    给select增加placeholder技巧
    易经中人生的六大阶段 :潜、现、惕、跃、飞、亢 你在第几个阶段?
    java 实现傅立叶变换算法 及复数的运算
    java 正则表达式 复习
    关于mysql varchar(N)
  • 原文地址:https://www.cnblogs.com/wzw0625/p/14375439.html
Copyright © 2020-2023  润新知