题目描述
在一个字符串(1<=字符串长度<=10000,全部由字母组成)中找到第一个只出现一次的字符,并返回它的位置
public class Solution {
public int FirstNotRepeatingChar(String str) {
int[] arr = new int[62];
for(int i=0;i<arr.length;i++){
arr[i] = -1;
}
for(int i=0;i<str.length();i++){
char t = str.charAt(i);
int index = t - 'A';
if(arr[index] == -1 && arr[index] != -2){
arr[index] = i;
}else{
arr[index] = -2;
}
}
int res = arr.length;
for(int i=0;i<arr.length;i++){
if(arr[i] >= 0){
if(res > arr[i])
res = arr[i];
}
}
if(res == arr.length)
return -1;
return res;
}
}
由于字母数量比较少,所以使用一个数组即可,根据字符减去‘A’,作为数组的下标即可,但是注意不能直接申请52的单位的内存。因为A虽然是所有字母里面ASCII最小的一个,但是大写字母和小写字母中间还存在着6个符号!最小为62的数组大小!
思想:存在一次的字母保存它的下标,超过一次的字母设置为一个特殊的数(这里为-2)。但是由于A这个字母会造成歧义!A-A=0,即开头为A且只有一个,那就可能出错(如果初始化为0,那么最后那些非字母的字母次数肯定为0,但是它不能是所求)。所以开始必须得把数组初始化为-1!
我在这里考虑的是申请一个和所有英文字母数量差不多大小的数组,而且它的数组下标对应的字母值是固定的!!!
2、也可以使用HashMap,这时候就没有必要考虑字母必须是顺序固定的了。对整个字符串遍历一遍,它的每个字符就会存到HashMap中。
重要的是:在第二次遍历字符串的时候,第一个出现次数为一的即是所求:
import java.util.*;
public class Solution {
public int FirstNotRepeatingChar(String str) {
int res = -1;
HashMap<Character,Integer> map = new HashMap();
for(int i=0;i<str.length();i++){
char t = str.charAt(i);
if(map.get(t) != null){
map.put(t,map.get(t)+1);
}else
map.put(t,1);
}
for(int i=0;i<str.length();i++){
if(map.get(str.charAt(i)) == 1){
res = i;
break;
}
}
return res;
}
}