在一个字符串(1<=字符串长度<=10000,全部由大小写字母组成)中找到第一个只出现一次的字符,并返回它的位置
先来看一个不太严谨的做法。我是想把字符串按字符一个一个存进list中,一旦存在就把存在重复的字符除去,直到最后一个字符,返回链表中第一个字符在字符串中位置就行。
代码:
public int FirstNotRepeatingChar(String str)
{
if(str.length()==0)
return -1;
char[]strChar=str.toCharArray();
List ts=new ArrayList();
int len=str.length();
for(int
i=0;i
{
if(!(ts.contains(strChar[i])))
{
ts.add(strChar[i]);
}
else
{
ts.remove(Character.valueOf(strChar[i]));
}
}
if(ts.size()<0)return -1;
return
str.indexOf(ts.get(0));
}
但是这个有一个很严重的问题,比如字符串是googgle,应该返回l所在位置,但是返回的是g
.为什么呢?因为第一次遇到g,存进list,第二次遇到g,将list中g出掉,但是第三次遇到g,list已经不存在g,所以他以为是第一次出现就把g存进去了。所以就出现了错误。
接下来看正确的
有一种方法就是统计每个字符串的出现的次数,然后查找第一个只出现一次的字符位置
代码:
HashMap
map=new HashMap();
for(int
i=0;i
{
char
c=str.charAt(i);
if(map.containsKey(c))
{
int time=map.get(c);
time++;
map.put(c,time);
}
else
{
map.put(c,1);
}
}
for(int
i=0;i
{
char
c=str.charAt(i);
if(map.get(c)==1)
return
i;
}
return
-1;