【简单】力扣算法题解析LeetCode246:中心对称数

关注文末推广名片,即可免费获得本题测试源码

题目来源:🔒LeetCode246:中心对称数

问题抽象: 判断一个数字字符串是否为中心对称数(旋转 180° 后与原字符串相同),满足以下核心需求:

  1. 对称规则定义

    • 有效对称字符对:'0'↔'0', '1'↔'1', '6'↔'9', '8'↔'8', '9'↔'6'
    • 非对称字符(如 2,3,4,5,7)直接判定无效;
    • 字符串必须满足:对任意位置 i,字符 s[i]s[n-1-i] 成有效对称对(n 为长度)。
  2. 对称验证方法

    • 双指针从两端向中心扫描:
      • 左指针字符必须严格映射为右指针字符(如左 '6' 则右必须为 '9');
      • 中心字符(长度奇数时)必须是 '0','1','8' 之一。
  3. 边界处理

    • 空字符串返回 false(题目实际输入非空,但逻辑需处理);
    • 单字符:仅 '0','1','8' 有效('6''9' 无效);
    • 前导零有效(如 "001" 无效,因 '0' 映射 '0'"001" 旋转为 "100" 不相等)。

输入:数字字符串 num(长度 ≥1
输出:布尔值 true/false,表示是否为中心对称数。


解题思路

中心对称数的核心是字符旋转后的映射关系

  1. 有效字符:只有 01689 旋转后仍是有效数字(23457 无效)。
  2. 映射规则
    • 001188(自身对称)
    • 6996(互相映射)

算法设计(双指针法)

  1. 初始化映射表:使用数组 d[10] 存储每个数字旋转后的值(无效数字设为 -1)。
  2. 双指针遍历
    • 左指针 i 从头部开始,右指针 j 从尾部开始。
    • 检查 num[i]num[j] 是否满足 d[num[i]] = num[j]
    • 任意一对不匹配则返回 false
  3. 边界处理
    • 单字符(如 "1")直接通过映射表校验。
    • 奇数长度时,中间字符必须是 018(隐含在映射表中校验)。

代码实现(Java版)🔥点击下载源码

class Solution {
    public boolean isStrobogrammatic(String num) {
        // 定义旋转映射表:d[i] 表示数字 i 旋转后的值(无效则为 -1)
        int[] d = new int[]{0, 1, -1, -1, -1, -1, 9, -1, 8, 6}; // 索引 0~9 对应字符 '0'~'9'
        char[] chars = num.toCharArray();
        int i = 0, j = chars.length - 1;
        
        while (i <= j) {
            int a = chars[i] - '0';   // 左指针字符转数字
            int b = chars[j] - '0';   // 右指针字符转数字
            if (d[a] != b) {          // 检查旋转后是否匹配
                return false;
            }
            i++;
            j--;
        }
        return true;
    }
}

代码说明

  1. 映射表优化
    • 用数组 d 代替 HashMap,减少哈希计算开销,提升访问速度 。
    • 例如 d[6] = 9 表示 '6' 旋转后应为 '9'
  2. 指针同步移动
    • 双指针 ij 向中间移动,每次比较一对字符。
    • 若发现无效字符(如 d[a] = -1)或映射不匹配,立即返回 false
  3. 边界处理
    • 空字符串:题目未明确,但代码中 num.length()=0 时循环不执行,直接返回 true(符合逻辑)。
    • 单字符:如 "0" 满足 d[0]=0,匹配自身 。

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

达文汐

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值