题目
在字符串 s 中找出第一个只出现一次的字符。如果没有,返回一个单空格。 s 只包含小写字母。
限制:
0 <= s 的长度 <= 50000
思路
要找出第一次只出现一次的字符,你至少要知道每个字符的出现次数,因为还要找到第一次出现的,所以,还得记录下他们出现的次数。
因为题目里面,字符串s是一个只含有小写子母的字符串,也有可能是空串。这个剔除一下就好了。
我们利用一个队列来记录他们出现的先后顺序,利用一个数组来记录他们出现的次数。
然后,将队列的字符逐一弹出,判断它所对应的次数是不是一次即可。
代码
//找出第一个出现一次的字符
class Solution {
public char firstUniqChar(String s) {
if (s.length()==0)
return ' ';
int isApperar[]=new int[26];
Queue <Character> queue=new LinkedList<>();
int length=s.length();
int temp=0;
for (int i=0;i<length;++i)
{
temp=(s.charAt(i)-97);
if (isApperar[temp]==0)//第一次出现,入队
{
queue.offer(s.charAt(i));//按照出现次序入队
++isApperar[temp]; //出现了
}
else
++isApperar[temp];//多次出现,就计算次数就好了
}
char result=' ';// 空白字符
while (!queue.isEmpty())//队列不为空
{
if (isApperar[queue.peek()-97]==1) //刚刚好记录的次数是1
{
result=queue.poll();
break;
}
else
queue.poll();//弹出出现次数不为1的值
}
return result;
}
}
结果
简单题来的,就懂得使用一个队列就可以了,其他的,没什么难度。
想法
看到题解还有人使用哈希表来计数,这样太慢了,用数字计数最多也就开一个长度为26的数组,而且,计数也简单。用哈希表太麻烦了!