• 刷题-判断是否是回文数-C++实现


    一、题目简介

    在这里插入图片描述

    二、思路

    1.反转一半的数字,然后和剩下的一半进行对比。
    对于一些特殊情况要有所考虑,如负数排除,如整数的开头不可以是0,所以要反转的数字的后半部分的最后一个数字不为0 。
    根据这个思路设计好算法。
    该思路的难点是如何知道我们已经反转了一半的数字了。这个要分奇数情况和偶数情况分别讨论。
    由于整个过程我们不断将原始数字除以 10,然后给反转后的数字乘上 10,所以,当原始数字小于或等于反转后的数字时,就意味着我们已经处理了一半位数的数字了

    三、解决方法

    1.反转一半对比法

    class Solution {
    public:
        bool isPalindrome(int x) {
            // 特殊情况:
            // 如上所述,当 x < 0 时,x 不是回文数。
            // 同样地,如果数字的最后一位是 0,为了使该数字为回文,
            // 则其第一位数字也应该是 0
            // 只有 0 满足这一属性
            if (x < 0 || (x % 10 == 0 && x != 0)) {
                return false;
            }
    
            int revertedNumber = 0;
            while (x > revertedNumber) {
                revertedNumber = revertedNumber * 10 + x % 10;
                x /= 10;
            }
    
            // 当数字长度为奇数时,我们可以通过 revertedNumber/10 去除处于中位的数字。
            // 例如,当输入为 12321 时,在 while 循环的末尾我们可以得到 x = 12,revertedNumber = 123,
            // 由于处于中位的数字不影响回文(它总是与自己相等),所以我们可以简单地将其去除。
            return x == revertedNumber || x == revertedNumber / 10;
        }
    };
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25

    四、涉及到的知识点

    1.取余取整
    通过取整和取余操作获取整数中对应的数字进行比较。
    举个例子:1221 这个数字。
    通过计算 1221 / 1000, 得首位1。
    通过计算 1221 % 10, 可得末位 1。

    五、总结对比

    1.反转一半比较法的时间复杂度
    时间复杂度:O(logn),对于每次迭代,我们会将输入除以 10,因此时间复杂度为 O(logn)。
    空间复杂度:O(1)。我们只需要常数空间存放若干变量。

  • 相关阅读:
    6.1 KMP算法搜索机器码
    2022阿里云栖大会,顶尖科技趋势峰会和全链路元宇宙体验
    Vue 学习笔记 错误ResizeObserver loop completed with undelivered notifications
    这份SVN命令备忘清单,请查收
    RemObjects Elements多用途软件开发工具链
    Flink中的状态一致性
    C\C++刷题DAY5
    基于Java毕业设计大学生兼职招聘网站源码+系统+mysql+lw文档+部署软件
    UI 自动化测试 —— selenium的简单介绍和使用
    基于R语言机器学习方法与案例分析
  • 原文地址:https://blog.csdn.net/weixin_45594172/article/details/126914247