题目描述
在一个字符串(0<=字符串长度<=10000,全部由字母组成)中找到第一个只出现一次的字符,并返回它的位置, 如果没有则返回 -1(需要区分大小写)。
思路分析
可以维护一个Map也可以用一个数组存储每个字母出现的次数,最后遍历一遍数组找到第一个数组内容为1的字母即可。
其中精髓是建立数组长度为58.而不是26*2=52,因为A-Z的ASCII码为65-90,a-z的ASCII码为97-122,将中间8个字符也放进数组中,这样可以免去判断大小写字符。
代码实现
public int FirstNotRepeatingChar(String str) {
if (str.length() == 0) {
return -1;
}
//这个58是精髓
int[] nums = new int[58];
for (int i = 0; i < str.length(); i++) {
nums[((int) str.charAt(i)) - 65] += 1;
}
for (int i = 0; i < nums.length; i++) {
if (nums[((int) str.charAt(i)) - 65] == 1) {
return i;
}
}
return -1;
}