当前位置: 首页 > article >正文

【面试经典150 | 数学】回文数

文章目录

  • 写在前面
  • Tag
  • 题目来源
  • 题目解读
  • 解题思路
    • 方法一:反转一半数字
  • 其他语言
    • python3
  • 写在最后

写在前面

本专栏专注于分析与讲解【面试经典150】算法,两到三天更新一篇文章,欢迎催更……

专栏内容以分析题目为主,并附带一些对于本题涉及到的数据结构等内容进行回顾与总结,文章结构大致如下,部分内容会有增删:

  • Tag:介绍本题牵涉到的知识点、数据结构;
  • 题目来源:贴上题目的链接,方便大家查找题目并完成练习;
  • 题目解读:复述题目(确保自己真的理解题目意思),并强调一些题目重点信息;
  • 解题思路:介绍一些解题思路,每种解题思路包括思路讲解、实现代码以及复杂度分析;
  • 知识回忆:针对今天介绍的题目中的重点内容、数据结构进行回顾总结。

Tag

【回文数】【数组】


题目来源

9. 回文数


题目解读

判断给定的整型数字是否回文。


解题思路

回文指的是从左往右以及从右往左读一个数字、字符串以及链表等等都是一样的。回文问题分为字符串回文、数字回文以及链表回文等。回文问题是比较基础而简答的问题,通常采用 “反转” 的方法得到一个新的字符串、数字或者链表,然后将新得到的与原有的进行比较如果相同就是回文的。但是对于判断数字回文问题 “反转” 可能后造成溢出问题,需要谨慎处理。

在 C++ 中,如果反转后得到的整数超过了 INT_MAX,那么就会导致溢出问题。于是想到了反转一半数字的方法。

其实还有将整数数字转成字符串的形式,再对字符串进行判断是否回文的方法,对字符串判断回文的方法就更多了:

  • 反转;
  • 双指针;
  • 等等。

这里的题解只针对回文数这一种回文问题,其他方法,读者可以自行尝试。

方法一:反转一半数字

首先处理一些容易判断的情况,负数一定不会是回文数,并且个位数是 0 的整数也不会是回文数(因为数字的高位不可能是 0)。

反转数字,我们通过不断的对原数 num 取整与取余并进行一些乘 10 加余的操作可以得到反转的数字,但是如何判断是否已经反转了一半数字呢?

由于整个过程我们不断将原始数字除以 10,然后给反转后的数字乘上 10,所以,当原始数字小于或等于反转后的数字时,就意味着我们已经处理了一半位数的数字了。

根据图示(LeetCode官方题解图片)我们发现,x 数字长度为奇数和偶数的情况不同,于是最后如果 x = x2 或者 x = x2 / 10x 为回文数。

实现代码

class Solution {
public:
    bool isPalindrome(int x) {
        if (x < 0 || (x % 10 == 0 && x != 0)) {
            return false;
        }

        int x2 = 0;
        while (x > x2) {
            x2 = x2 * 10 + x % 10;
            x /= 10;
        }
        return x == x2 || x == x2 / 10;
    }
};

复杂度分析

时间复杂度: O ( l o g n ) O(logn) O(logn) n n n 为数字 x 的值。

空间复杂度: O ( 1 ) O(1) O(1)


其他语言

python3

python语言不会有溢出问题,可以直接反转数字再比较。

class Solution:
    def isPalindrome(self, x: int) -> bool:
        if x < 0:
            return False

        original_num = x
        reversed_num = 0

        while x > 0:
            digit = x % 10
            reversed_num = reversed_num * 10 + digit
            x //= 10
        return original_num == reversed_num

写在最后

如果文章内容有任何错误或者您对文章有任何疑问,欢迎私信博主或者在评论区指出 💬💬💬。

如果大家有更优的时间、空间复杂度方法,欢迎评论区交流。

最后,感谢您的阅读,如果感到有所收获的话可以给博主点一个 👍 哦。


http://www.kler.cn/a/134659.html

相关文章:

  • 【MySQL 保姆级教学】事务的自动提交和手动提交(重点)--上(13)
  • 跟着尚硅谷学vue2—基础篇4.0
  • 华为路由策略配置
  • 前端面试笔试(二)
  • EXCEL延迟退休公式
  • 量化交易系统开发-实时行情自动化交易-3.4.2.2.Okex交易数据
  • 计算机毕业设计选题推荐-个人博客微信小程序/安卓APP-项目实战
  • 硬盘无法格式化怎么办?
  • ModStartCMS v7.6.0 CMS备份恢复优化,主题开发文档更新
  • ESP32 Arduino实战协议篇-搭建独立的 Web 服务器
  • APP源码|智慧校园电子班牌源码 智慧校园云平台
  • Elasticsearch备份与还原:使用elasticdump
  • C#入门(5):数组、一维数组,二维数组、交错数组、数组复制
  • 数据资产入表,给企业带来的机遇和挑战
  • 02-1解析xpath
  • String的字符串拼接
  • 通付盾Web3专题 | KYT/AML:Web3合规展业的必要条件
  • 蓝桥杯 vector
  • nvm 安装后出现的各种问题解决方法
  • Redis 学习
  • linux 安装中文字体
  • vue中绑定class样式和条件渲染
  • Java中的局部变量和成员变量的区别
  • c语言:解决数组有关的删除,排序,合并等问题。
  • 在Linux上安装RStudio工具并实现本地远程访问【内网穿透】
  • 四、hdfs文件系统基础操作-保姆级教程