LeetCode9回文数Java代码报String index out of range错误原因求解
报错原因
你代码的核心问题是 每次截取新字符串后没有同步重置双指针的取值,导致指针索引超出了新字符串的有效下标范围。
我们以测试用例x=121为例,一步步看执行过程:
- 初始状态:
s = "121",i=0,j = s.length()-1 = 2 - 第一次进入
while(i<j)(0<2成立):- 比对
s.charAt(0)和s.charAt(2),值都是'1',相等 - 执行
s = s.substring(i+1,j),Java的substring是左闭右开规则,这里传入1和2,得到新的s = "2"
- 比对
- 第二次判断
while(i<j):你没有修改过i和j的值,二者还是i=0、j=2,0<2依然成立 - 执行第8行的
s.charAt(j):当前s的长度是1,有效下标只有0,调用charAt(2)直接触发下标越界错误。
修复方案
最简单的修改逻辑是不要修改原字符串,直接移动双指针即可,调整后代码如下:
class Solution { public boolean isPalindrome(int x) { String s = String.valueOf(x); int i = 0; int j = s.length()-1; while(i < j){ if(s.charAt(i) != s.charAt(j)){ return false; } // 直接移动指针,无需截取字符串 i++; j--; } return true; } }
如果你坚持要通过截取字符串实现,那每次截取后需要重置指针的取值,参考实现如下:
class Solution { public boolean isPalindrome(int x) { String s = String.valueOf(x); while(s.length() > 1){ int len = s.length(); if(s.charAt(0) != s.charAt(len-1)){ return false; } s = s.substring(1, len-1); } return true; } }
内容的提问来源于stack exchange,提问作者Binky
相关产品推荐
相关产品推荐

