问题是刚刚刷题发现的,题目不难。
题目描述
在一个字符串(0<=字符串长度<=10000,全部由字母组成)中找到第一个只出现一次的字符,并返回它的位置, 如果没有则返回 -1(需要区分大小写).
思路:用一个52长度的数组去统计频率,遍历两边即可。然后我就开始写代码了,
public int FirstNotRepeatingChar(String str) {
int[] count = new int[52];
for(int i=0; i
char c = str.charAt(i);
if(Character.isLowerCase(c))
count[c-'a']++;
else
count[c-'A'+26]++;
}
for(int i=0; i
char c = str.charAt(i);
if(Character.isLowerCase(c))
if(count[c-'a']==1)
return i;
else
if(count[c-'A'+26]==1)
return i;
}
return -1;
}
报错:
不通过
您的代码已保存
答案错误:您提交的程序没有通过所有的测试用例
case通过率为0.00%
测试用例:
对应输出应该为:
4
你的输出为:
java.lang.ArrayIndexOutOfBoundsException: 64
这个时候,我是一脸懵逼的,检查了一下没发现问题,然后只能赋值到IDE里去单步调试,发现了问题。
if(Character.isLowerCase(c))
if(count[c-'a']==1)
return i;
else
if(count[c-'A'+26]==1)
return i;
这里并没有按照我预想的方式,这样省略括号不行,得加上括号,然后提交通过。
if(Character.isLowerCase(c)){
if(count[c-'a']==1)
return i;
}
else{
if(count[c-'A'+26]==1)
return i;
}
然后,我仔细一看才发现,这里的else,匹配的是上面的第二个if语句。实际上相当于:
if(Character.isLowerCase(c))
if(count[c-'a']==1)
return i;
else
if(count[c-'A'+26]==1)
return i;
所以说,写多了python就习惯性看到缩进就想当然了,为了防止类似错误发生,以后一律统统加括号,这样就OK了。