题目来源:🔒LeetCode246:中心对称数
问题抽象: 判断一个数字字符串是否为中心对称数(旋转 180° 后与原字符串相同),满足以下核心需求:
-
对称规则定义:
- 有效对称字符对:
'0'↔'0','1'↔'1','6'↔'9','8'↔'8','9'↔'6'; - 非对称字符(如
2,3,4,5,7)直接判定无效; - 字符串必须满足:对任意位置
i,字符s[i]与s[n-1-i]成有效对称对(n为长度)。
- 有效对称字符对:
-
对称验证方法:
- 双指针从两端向中心扫描:
- 左指针字符必须严格映射为右指针字符(如左
'6'则右必须为'9'); - 中心字符(长度奇数时)必须是
'0','1','8'之一。
- 左指针字符必须严格映射为右指针字符(如左
- 双指针从两端向中心扫描:
-
边界处理:
- 空字符串返回
false(题目实际输入非空,但逻辑需处理); - 单字符:仅
'0','1','8'有效('6'、'9'无效); - 前导零有效(如
"001"无效,因'0'映射'0'但"001"旋转为"100"不相等)。
- 空字符串返回
输入:数字字符串 num(长度 ≥1)
输出:布尔值 true/false,表示是否为中心对称数。
解题思路
中心对称数的核心是字符旋转后的映射关系:
- 有效字符:只有
0、1、6、8、9旋转后仍是有效数字(2、3、4、5、7无效)。 - 映射规则:
0→0、1→1、8→8(自身对称)6→9、9→6(互相映射)
算法设计(双指针法):
- 初始化映射表:使用数组
d[10]存储每个数字旋转后的值(无效数字设为-1)。 - 双指针遍历:
- 左指针
i从头部开始,右指针j从尾部开始。 - 检查
num[i]和num[j]是否满足d[num[i]] = num[j]。 - 任意一对不匹配则返回
false。
- 左指针
- 边界处理:
- 单字符(如
"1")直接通过映射表校验。 - 奇数长度时,中间字符必须是
0、1或8(隐含在映射表中校验)。
- 单字符(如
代码实现(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;
}
}
代码说明
- 映射表优化:
- 用数组
d代替HashMap,减少哈希计算开销,提升访问速度 。 - 例如
d[6] = 9表示'6'旋转后应为'9'。
- 用数组
- 指针同步移动:
- 双指针
i和j向中间移动,每次比较一对字符。 - 若发现无效字符(如
d[a] = -1)或映射不匹配,立即返回false。
- 双指针
- 边界处理:
- 空字符串:题目未明确,但代码中
num.length()=0时循环不执行,直接返回true(符合逻辑)。 - 单字符:如
"0"满足d[0]=0,匹配自身 。
- 空字符串:题目未明确,但代码中

698

被折叠的 条评论
为什么被折叠?



