博客
关于我
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/

    你可能感兴趣的文章
    NIFI同步MySql数据_到SqlServer_错误_驱动程序无法通过使用安全套接字层(SSL)加密与SQL Server_Navicat连接SqlServer---大数据之Nifi工作笔记0047
    查看>>
    NIFI同步MySql数据源数据_到原始库hbase_同时对数据进行实时分析处理_同步到清洗库_实际操作06---大数据之Nifi工作笔记0046
    查看>>
    Nifi同步过程中报错create_time字段找不到_实际目标表和源表中没有这个字段---大数据之Nifi工作笔记0066
    查看>>
    NIFI大数据进阶_FlowFile拓扑_对FlowFile内容和属性的修改删除添加_介绍和描述_以及实际操作---大数据之Nifi工作笔记0023
    查看>>
    NIFI大数据进阶_FlowFile生成器_GenerateFlowFile处理器_ReplaceText处理器_处理器介绍_处理过程说明---大数据之Nifi工作笔记0019
    查看>>
    NIFI大数据进阶_FlowFile生成器_GenerateFlowFile处理器_ReplaceText处理器_实际操作---大数据之Nifi工作笔记0020
    查看>>
    NIFI大数据进阶_Json内容转换为Hive支持的文本格式_实际操作_02---大数据之Nifi工作笔记0032
    查看>>
    NIFI大数据进阶_Json内容转换为Hive支持的文本格式_操作方法说明_01_EvaluteJsonPath处理器---大数据之Nifi工作笔记0031
    查看>>
    NIFI大数据进阶_Kafka使用相关说明_实际操作Kafka消费者处理器_来消费kafka数据---大数据之Nifi工作笔记0037
    查看>>
    NIFI大数据进阶_Kafka使用相关说明_实际操作Kafka生产者---大数据之Nifi工作笔记0036
    查看>>
    NIFI大数据进阶_NIFI的模板和组的使用-介绍和实际操作_创建组_嵌套组_模板创建下载_导入---大数据之Nifi工作笔记0022
    查看>>
    NIFI大数据进阶_NIFI监控功能实际操作_Summary查看系统和处理器运行情况_viewDataProvenance查看_---大数据之Nifi工作笔记0026
    查看>>
    NIFI大数据进阶_NIFI监控的强大功能介绍_处理器面板_进程组面板_summary监控_data_provenance事件源---大数据之Nifi工作笔记0025
    查看>>
    NIFI大数据进阶_NIFI集群知识点_认识NIFI集群以及集群的组成部分---大数据之Nifi工作笔记0014
    查看>>
    NIFI大数据进阶_NIFI集群知识点_集群的断开_重连_退役_卸载_总结---大数据之Nifi工作笔记0018
    查看>>
    NIFI大数据进阶_使用NIFI表达式语言_来获取自定义属性中的数据_NIFI表达式使用体验---大数据之Nifi工作笔记0024
    查看>>
    NIFI大数据进阶_内嵌ZK模式集群1_搭建过程说明---大数据之Nifi工作笔记0015
    查看>>
    NIFI大数据进阶_内嵌ZK模式集群2_实际操作搭建NIFI内嵌模式集群---大数据之Nifi工作笔记0016
    查看>>
    NIFI大数据进阶_外部ZK模式集群1_实际操作搭建NIFI外部ZK模式集群---大数据之Nifi工作笔记0017
    查看>>
    NIFI大数据进阶_实时同步MySql的数据到Hive中去_可增量同步_实时监控MySql数据库变化_实际操作_03---大数据之Nifi工作笔记0035
    查看>>