题目描述:
标签:队列 哈希表 字符串 计数
在字符串 s 中找出第一个只出现一次的字符。如果没有,返回一个单空格。 s 只包含小写字母。
代码:
《方法一:哈希表实现》
思路分析:
先用hashmap统计每个字符的个数,然后再循环一次,找到只出现1次的第一个字符。
class Solution {
public char firstUniqChar(String s) {
Map<Character, Integer> map = new HashMap<>();
for(int i = 0;i < s.length();i++){
char ch = s.charAt(i);
map.put(ch, map.getOrDefault(ch,0) + 1);
}
for(int i = 0;i < s.length();i++){
if(map.get(s.charAt(i)) == 1){
return s.charAt(i);
}
}
return ' ';
}
}
《方法二:队列实现》
思路分析:
定义一个128长度的数组用来统计ASCII字符码出现的次数,遍历字符串,先将对应的计数器+1,然后加入队列,然后循环判断当前队列头的元素是不是次数>1,次数大于1的就弹出,所以最后剩下的队列头就是第一次出现的不重复的字符。
class Solution {
public char firstUniqChar(String s) {
int[] cnts = new int[128];
Queue<Character> queue = new LinkedList<>();
for(int i = 0;i < s.length();i++){
cnts[s.charAt(i)]++;
queue.add(s.charAt(i));
while(!queue.isEmpty() && cnts[queue.peek()] > 1){
queue.poll();
}
}
if(queue.isEmpty()){
return ' ';
}
return queue.peek();
}
}