50.第一个只出现一次的字符

题目描述

原题
在字符串 s 中找出第一个只出现一次的字符。如果没有,返回一个单空格。 s 只包含小写字母。
示例:
1
s = "abaccdeff"
2
返回 "b"
3
4
s = ""
5
返回 " "
Copied!
限制:
0 <= s 的长度 <= 50000

题解

解法一

1
class Solution {
2
public char firstUniqChar(String s) {
3
if(s == null) return ' ' ;
4
//不能声明一个集合 因为如果声明一个集合,从set中remove之后
5
//如果后续有重复的就无法判断
6
//set校验重复 list没有重复的添加、遇到重复的移除
7
Set<Character> set = new HashSet<>();
8
ArrayList<Character> list = new ArrayList<>();
9
for(int i = 0;i < s.length();i++){
10
//注意:这里必须返回Character
11
//因为remove的时候如果是char会转换成int 引发越界
12
Character c = s.charAt(i);
13
if(set.contains(c)){
14
list.remove(c);
15
}else{
16
set.add(c);
17
list.add(c);
18
}
19
}
20
return list.size() > 0 ? list.get(0) : ' ';
21
}
22
}
Copied!

解法二

1
class Solution {
2
public char firstUniqChar(String s) {
3
if(s == null) return ' ' ;
4
Map<Character,Boolean> map = new LinkedHashMap<>();
5
for(int i = 0;i < s.length();i++){
6
char c = s.charAt(i);
7
map.put(c,!map.containsKey(c));
8
}
9
for(Map.Entry<Character,Boolean> entry:map.entrySet()){
10
if(entry.getValue()) return entry.getKey();
11
}
12
return ' ';
13
}
14
}
Copied!
最近更新 10mo ago