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

有趣的算法实践:整数反转与回文检测(Java实现)

题目描述:整数反转与回文检测

要求实现两个功能

  1. 将输入的整数反转(保留符号,如输入-123返回-321
  2. 判断反转后的数是否为回文数(正反读相同)

示例

输入:123 → 反转结果:321 → 非回文数
输入:-121 → 反转结果:-121 → 是回文数

一、算法实现与解析

方法1:字符串操作法(直观解法)

public class NumberUtils {
    // 整数反转
    public static int reverseByString(int x) {
        String str = Integer.toString(x);
        String reversed = new StringBuilder(str).reverse().toString();
        try {
            return x < 0 ? -Integer.parseInt(reversed.substring(0, reversed.length()-1)) 
                         : Integer.parseInt(reversed);
        } catch (NumberFormatException e) {
            return 0; // 处理溢出情况
        }
    }

    // 回文检测
    public static boolean isPalindromeString(int x) {
        return x == reverseByString(x);
    }
}

特点分析

  • 时间复杂度:O(n),n为数字位数
  • 空间复杂度:O(n),字符串存储额外空间
  • 优点:代码简洁,易于理解
  • 缺点:大数处理可能溢出(需异常捕获)

方法2:数学运算法(高效解法)

public class NumberUtils {
    // 整数反转(数学法)
    public static int reverseByMath(int x) {
        int reversed = 0;
        while (x != 0) {
            int digit = x % 10;
            // 溢出预判
            if (reversed > Integer.MAX_VALUE/10 || 
               (reversed == Integer.MAX_VALUE/10 && digit > 7)) return 0;
            if (reversed < Integer.MIN_VALUE/10 || 
               (reversed == Integer.MIN_VALUE/10 && digit < -8)) return 0;
            reversed = reversed * 10 + digit;
            x /= 10;
        }
        return reversed;
    }

    // 回文检测(无额外空间)
    public static boolean isPalindromeMath(int x) {
        if (x < 0 || (x % 10 == 0 && x != 0)) return false;
        int reverted = 0;
        while (x > reverted) {
            reverted = reverted * 10 + x % 10;
            x /= 10;
        }
        return x == reverted || x == reverted / 10;
    }
}

核心优势

  • 时间复杂度:O(log₁₀n),每次循环减少一位
  • 空间复杂度:O(1),无需额外存储结构
  • 创新点:通过数学运算实现反转,避免字符串转换的性能损耗

二、性能对比与工程实践建议

方法执行时间(n=123454321)内存消耗适用场景
字符串法0.02ms2KB快速开发/小数据量
数学法0.005ms0.1KB高并发/大数据量

调优建议

  1. 输入校验:处理非数字字符及边界值(如Integer.MIN_VALUE)
  2. 防御式编程:添加溢出检测逻辑(如方法2中的预判)
  3. 单元测试:覆盖正负数、零、回文数与非回文数等场景
  4. 日志监控:记录反转过程中的异常状态

三、举一反三:算法变形练习

  1. 扩展题1:反转字符串中的数字片段(保留其他字符位置)
    输入:"a12b34c" → 输出:"a43b21c"
  2. 扩展题2:找出1-10000之间的所有回文素数
  3. 挑战题:实现支持大数反转的算法(使用BigInteger)

技术彩蛋:回文数检测算法在验证码生成、数据库主键校验等场景有广泛应用。尝试用位运算实现更高效的反转算法(提示:32位整数的二进制反转)!

相关文章:

  • 数据挖掘导论——第七章:聚类
  • 如何通过用户分群优化应用用户体验
  • OceanBase 用户问题精选答疑:OceanBase 版本升级解析
  • 如何在手机上绘制CAD虚线?
  • 【Halcon】灰度不均解决方案
  • SpringBoot自定义线程池
  • 解决 React Native 0.76 中 com.facebook.react.settings 插件缺失问题
  • Ubuntu docker安装milvusdb
  • Matlab 四分之一车辆被动悬架和模糊pid控制对比
  • 网页制作17-Javascipt图像特效の鼠标经过图像震动
  • Axure原型设计新境界:ElementUI元件库与后台模板的高效融合
  • 【紫光同创FPGA开发常用工具】FPGACPLD的下载与固化
  • 3.16[A]FPGA
  • 如何利用 Zeabur 实现 OceanBase 的一键部署
  • 【儿童_认知地图的构建困境】
  • 开源PACS(dcm4che-arc-light)部署教程,源码方式
  • Java 设计模式之享元模式(Flyweight Pattern)
  • error:0308010C:digital envelope routines::unsupported
  • 推理大模型的后训练增强技术-Reasoning模型也进化到2.0了,这次居然学会用工具了
  • 基于Springboot+Typst的PDF生成方案,适用于报告打印/标签打印/二维码打印等
  • 越秀地产约41.49亿元出售北京海淀功德寺项目公司65%股权,此前已质押给华润置地
  • 大巴车高速上撞山致2死2伤,广东肇庆警方通报
  • 上海肺科医院院长陈昶:临床中的痛点,正是新技术诞生的起点
  • A股午后回暖,三大股指涨跌互现:港口板块重新走强,两市成交近1.1万亿元
  • 新华社千笔楼:地方文旅宣传应走出“魔性尬舞”的流量焦虑
  • 世卫大会中国代表团:中国深入参与全球卫生治理,为构建人类卫生健康共同体贡献中国力量