LeetCode 9回文数:字符串双指针判断写法错误原因排查
转字符串实现回文数判断的逻辑错误排查
问题现象
通过整数转字符串的双指针对比思路实现回文数判断时,两种分支写法结果差异明显:
- 分支逻辑1:循环内先判断对称位置字符相等,相等则移动左右指针,输入测试用例
121时返回false,不符合预期 - 分支逻辑2:循环内先判断对称位置字符不相等,不相等则直接返回结果,可通过全部测试用例
错误实现代码
class Solution { public boolean isPalindrome(int x) { String s = String.valueOf(x); //n int l = s.length(); int i = 0; int j = l - 1; while (i <= j) { if (s.charAt(i) == s.charAt(j)) { i++; j--; } return false; } return true; } }
正确实现代码
class Solution { public boolean isPalindrome(int x) { String s = String.valueOf(x); //n int l = s.length(); int i = 0; int j = l - 1; while (i <= j) { if (s.charAt(i) != s.charAt(j)) { return false; } i++; j--; } return true; } }
错误根因
错误代码的核心问题是return false语句的作用域错误:
- 该语句没有被包裹在
if判断的分支内,属于while循环体中无条件执行的语句。也就是说不管对称位置的字符是否匹配,只要进入while循环,跑完if块的逻辑后就会直接执行return false终止函数,循环永远只会执行1次,根本不会完成全字符串的对称校验。 - 以输入
121为例:第一次进循环时i=0、j=2,两个位置的字符都是'1',确实满足相等判断,指针会移动到i=1、j=1,随后代码直接跳出if块执行return false,根本不会走到中间位置'2'的校验逻辑,直接返回错误结果。
如果要保留「判断相等再移动指针」的写法,需要把不匹配返回的逻辑放到else分支中,保证只有字符不匹配时才提前返回,修正后的等价写法如下:
while (i <= j) { if (s.charAt(i) == s.charAt(j)) { i++; j--; } else { return false; } } return true;
对比正确实现的逻辑:return false完全处于「字符不相等」的if分支内,只有对称位置字符真的不匹配时才会提前终止返回错误;字符匹配时会正常移动指针进入下一轮校验,直到双指针交叉(所有对称位置校验通过)才跳出循环返回true,逻辑完全闭环。
内容的提问来源于stack exchange,提问作者Daisy
相关产品推荐
相关产品推荐

