LeetCode - 按标签分类刷题(字符串题解)——回文串系列
发布日期:2021-05-07 21:21:52 浏览次数:25 分类:精选文章

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

判断一个整数是否是回文数。回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。以下是详细的方法和步骤:

方法一:字符串反转法

  • 特殊情况处理

    • 如果整数小于0,直接返回false,因为负数无法成为回文数。
    • 如果整数为0,返回true。
    • 如果整数的最后一位是0,且整数不为0,返回false,因为这样的数无法成为回文数。
  • 将整数转换为字符串

    • 使用字符串表示来便于操作和反转。
  • 反转字符串

    • 创建一个反转后的字符串。
  • 比较字符串

    • 判断原字符串和反转后的字符串是否相等。
  • 返回结果

    • 如果相等,返回true;否则返回false。
  • 代码示例

    public class Solution {    public boolean isPalindrome(int x) {        // 处理特殊情况        if (x < 0) return false;        if (x == 0) return true;        if (x % 10 == 0) return false; // 除0以外,数不以0结尾                // 将整数转换为字符串        String str = Integer.toString(x);                // 反转字符串        String reversedStr = new StringBuilder(str).reverse().toString();                // 比较        return str.equals(reversedStr);    }}

    方法二:数学反转法

  • 处理特殊情况

    • 如果x < 0,返回false。
    • 如果x == 0,返回true。
    • 如果x % 10 == 0,返回false。
  • 初始化变量

    • div 用于截取数字的最高位。
    • revertedNumber 用于存储反转后的数字。
    • x 逐步缩小范围,直到无法再进行比较。
  • 循环处理

    • 每次截取当前数字的最高位和最低位进行比较。
    • 如果最高位和最低位不相等,返回false。
    • 缩小数字范围,继续循环。
  • 处理奇数位情况

    • 如果数字长度为奇数,最后一步不需要比较中间的最高位和最低位。
  • 返回结果

    • 如果所有对应位数相等,返回true。
  • 代码示例

    public class Solution {    public boolean isPalindrome(int x) {        // 处理特殊情况        if (x < 0) return false;        if (x == 0) return true;        if (x % 10 == 0) return false; // 除0以外,数不以0结尾                int revertedNumber = 0;        int div = 1;                while (x > revertedNumber) {            int digit = x % 10;            if (digit < 0) {                return false;            }            revertedNumber = revertedNumber * 10 + digit;            x /= 10;            // 处理div            while (x / div >= 10) {                div *= 10;            }        }        // 判断是否为偶数位或奇数位        return x == revertedNumber || x == revertedNumber / 10;    }}

    方法三:巧妙的反转法

  • 处理特殊情况

    • 如果x < 0,返回false。
    • 如果x % 10 == 0,返回false,除非x == 0。
  • 反转数字

    • 使用取余和除法操作,逐步反转数字。
  • 比较数字

    • 在反转过程中,逐步比较两边的数字是否相等。
  • 处理奇偶位数

    • 如果数字长度为偶数,直接比较两边是否相等。
    • 如果数字长度为奇数,最后一步不需要比较中间的最高位和最低位。
  • 代码示例

    public class Solution {    public boolean isPalindrome(int x) {        // 处理特殊情况        if (x < 0 || (x % 10 == 0 && x != 0)) {            return false;        }                int revertedNumber = 0;        while (x > revertedNumber) {            int digit = x % 10;            revertedNumber = revertedNumber * 10 + digit;            x /= 10;        }        return x == revertedNumber || x == revertedNumber / 10;    }}

    总结

    以上方法均可用于判断一个整数是否是回文数。选择哪种方法取决于具体的性能需求和代码复杂度。字符串反转法简单易懂,适合大多数情况,而数学反转法则更高效,适合处理大数问题。

    上一篇:【Java多线程之锁】互斥锁、自旋锁、读写锁、悲观锁、乐观锁的应用场景
    下一篇:【Redis】哨兵模式 Sentinel

    发表评论

    最新留言

    关注你微信了!
    [***.104.42.241]2025年03月25日 19时16分04秒