博客
关于我
9. Palindrome Number
阅读量:804 次
发布时间:2019-03-25

本文共 2208 字,大约阅读时间需要 7 分钟。

如何判断整数是否为回文数?我们不使用额外空间

判断一个整数是否为回文数,是一个常见的算法题目。在这一问题中,我们需要完全不使用额外的空间。这个限制意味着我们不能使用字符串或者其他占用内存的方法来处理数字,最终需要用数学方法来完成任务。

问题解析

我们需要判断一个整数是否为正整数且能够反转,从而得到相同的数。然而,负数不可能是回文数,因为它们的首位是负号,而尾部分只能是正数。

解题思路 我们可以采用两种主要方法来判断一个数是否为回文数:

方法一:反转数值

  • 初始化一个变量s,用来存储反转后的数。
  • 从原始数出发,循环取模分解每一位数字并累加。
  • 最后比较反转后的数和原始数是否相等。
  • 优点:代码简单,易于实现。

    方法二:逐层消减数字

  • 初始化一个长度变量,初始值为1。
  • 在每次循环中,检查当前数值能否被长度扩大而仍然是两位数(即,数/长度是否大于等于10)。
  • 当尾部和头部分不同时,返回false。
  • 如果左右两位相等,继续从中间向外剥离两位数字,最终检查剩下的数是否为0。
  • 优点:在逐步比较过程中可以提前终止判断,提升了效率。缺点:需要多pass多次,且各位数字的处理较为麻烦。

    推荐方法:方法一更适合大多数情况,但在反转过程中可能出现溢出问题。要如何处理这种情况?答案是不能单纯反转并比较,而应寻求更数学化的处理方式。

    代码示例:使用方法一示范

    bool isPalindrome(int x) {
    if(x < 0) return false;
    int num = x;
    int s = 0, mod;
    while(num) {
    mod = num % 10;
    s = s * 10 + mod;
    num = num / 10;
    }
    return(s == x);
    }

    其他思路

  • 每次取出最高位和最低位进行比较。
  • 如果两部分相等,去除这两位数字后缩小范围继续。
  • 但这一方法需要先确定数字长度,可能不得不进行pass操作。
  • 值得注意的问题 负整数是否为回文数?通常负数不被视为回文数,因为很难定义它的首位和尾部是否对称(例如,-121是否为回文数?答案是不,因为如果写成字符串是-1,而末尾是1,所以并不对称)。

    代码优化要点 对于大数情况,可以使用长整数来处理中间反转,但如果超过系统整型范围,会导致溢出。在实际编码中,建议分别处理整数和长整数两种情况,并根据编译环境进行切换。

    验证测试 测试用例:

  • x = 12321 → true
  • x = -121 → false
  • x = 0 → true
  • x = 121 → true
  • x = 123 → false
  • 如何进一步测试? 我们可以构造例如1234567899这样的数,检查反转是否会溢出。例如:

  • x = 1999999999 → 反转后会变成9999999991,超过整型上限(通常为2^31 -1),导致s溢出。在这种情况下,是否可以判断x的反转数是否与原数的组成一致?或者是否可以中途终止反转过程?
  • 但这超出了题目范围。按照基本情况,当x不能被完全反转时,我们可以直接返回false,这也是原题所要求的。

    这种方法在实际应用中性能如何?反转一个最多有几百位的数,每天都要判断多次请求,这样的处理方式可能产生性能问题。因此,可以进一步优化,比如记录当前反转过程中的上限,从而避免不必要的循环,但这样做会显著增加代码复杂度,并可能导致额外使用内存。

    在本题中,我们只需完成基本判断,因此采用简单反转方法是可接受的。

    通过对比两种方法,可以发现方法一实现简单明了,且速度较快。即使在极端情况下导致溢出,根据题意的要求,我们可以算作有效判断,因为反转后的数会超过范围,从而不再等于原数。这实际上已经包含了对溢出的处理。

    最后,这段代码是否可以直接用在实际项目中?

    答案是否。因为当x是最大整型数时,比如2147483647,其反转数会是7463847412,超过了整型的最大值,这样s会被赋值为负数或者其他错误的值,并导致判断错误。因此,在具体应用中,如果数值范围较大,我们需要额外的处理,以确保不会溢出。这种情况下,可以采用Long数据类型来执行反转操作,然后与X进行比较。

    这引出了一个更通用的解法:不一定非要把数值反转,而是可以检查这个数值的数字是否对称。例如,我们可以同时跟踪当前反转的数值和原始数的高位部分。但这种方法可能会稍微复杂一些。

    目前,最值代码如下:

    bool isPalindrome(int x) {
    if(x < 0) return false;
    int orig = x;
    long rev = 0;
    while(x > 0){
    rev = rev * 10 + x %10;
    x /=10;
    }
    return(rev == orig);
    }

    这个版本使用了长整数来处理可能的溢出。这是一个更谨慎的做法。例如,x=1999999999时,rev会变成1999999999的回文数,但是由于溢出,可能会导致系统栈溢出。在这种情况下,如果代码在编译时是64位的长整型,就不会出现溢出的情况。

    所以,最后的结论是,要根据应用场景和编译环境的长整数支持,来选择反转方式。

    转载地址:http://zgiyk.baihongyu.com/

    你可能感兴趣的文章
    Nginx面试三连问:Nginx如何工作?负载均衡策略有哪些?如何限流?
    查看>>
    Nginx:NginxConfig可视化配置工具安装
    查看>>
    ngModelController
    查看>>
    ngrok | 内网穿透,支持 HTTPS、国内访问、静态域名
    查看>>
    NHibernate学习[1]
    查看>>
    NHibernate异常:No persister for的解决办法
    查看>>
    NIFI1.21.0_Mysql到Mysql增量CDC同步中_日期类型_以及null数据同步处理补充---大数据之Nifi工作笔记0057
    查看>>
    NIFI1.21.0_Mysql到Mysql增量CDC同步中_补充_更新时如果目标表中不存在记录就改为插入数据_Postgresql_Hbase也适用---大数据之Nifi工作笔记0059
    查看>>
    NIFI1.21.0_NIFI和hadoop蹦了_200G集群磁盘又满了_Jps看不到进程了_Unable to write in /tmp. Aborting----大数据之Nifi工作笔记0052
    查看>>
    NIFI1.21.0通过Postgresql11的CDC逻辑复制槽实现_指定表多表增量同步_增删改数据分发及删除数据实时同步_通过分页解决变更记录过大问题_02----大数据之Nifi工作笔记0054
    查看>>
    NIFI1.21.0通过Postgresql11的CDC逻辑复制槽实现_指定表或全表增量同步_实现指定整库同步_或指定数据表同步配置_04---大数据之Nifi工作笔记0056
    查看>>
    NIFI1.23.2_最新版_性能优化通用_技巧积累_使用NIFI表达式过滤表_随时更新---大数据之Nifi工作笔记0063
    查看>>
    NIFI从MySql中增量同步数据_通过Mysql的binlog功能_实时同步mysql数据_根据binlog实现数据实时delete同步_实际操作04---大数据之Nifi工作笔记0043
    查看>>
    NIFI从MySql中增量同步数据_通过Mysql的binlog功能_实时同步mysql数据_配置binlog_使用处理器抓取binlog数据_实际操作01---大数据之Nifi工作笔记0040
    查看>>
    NIFI从MySql中增量同步数据_通过Mysql的binlog功能_实时同步mysql数据_配置数据路由_实现数据插入数据到目标数据库_实际操作03---大数据之Nifi工作笔记0042
    查看>>
    NIFI从MySql中增量同步数据_通过Mysql的binlog功能_实时同步mysql数据_配置数据路由_生成插入Sql语句_实际操作02---大数据之Nifi工作笔记0041
    查看>>
    NIFI从MySql中离线读取数据再导入到MySql中_03_来吧用NIFI实现_数据分页获取功能---大数据之Nifi工作笔记0038
    查看>>
    NIFI从MySql中离线读取数据再导入到MySql中_无分页功能_02_转换数据_分割数据_提取JSON数据_替换拼接SQL_添加分页---大数据之Nifi工作笔记0037
    查看>>
    NIFI从PostGresql中离线读取数据再导入到MySql中_带有数据分页获取功能_不带分页不能用_NIFI资料太少了---大数据之Nifi工作笔记0039
    查看>>
    nifi使用过程-常见问题-以及入门总结---大数据之Nifi工作笔记0012
    查看>>