一、問題描述:
在字符串 s 中找出第一個只出現一次的字符。如果沒有,返回一個單空格。
示例:
s = "abaccdeff"
返回 "b"
s = ""
返回 " "
二、解決思路:
1、LinkHashMap
public char firstUniqChar(String str) {
if (str == null || str.equals("")){
return ' ';
}
//LinkedHashMap可以保證元素的有序性,Integer記錄元素中每個字符的個數
Map<Character,Integer> map = new LinkedHashMap<>();
for(int i=0;i<str.length();i++){
char c = str.charAt(i);
if(map.containsKey(c)){
map.put(c,(map.get(c)+1));
}else{
map.put(c,1);
}
}
//遍歷出第一個個數爲1的字符並返回
Iterator<Map.Entry<Character,Integer>> iterator = map.entrySet().iterator();
while(iterator.hasNext()){
Map.Entry<Character, Integer> next = iterator.next();
if (next.getValue() == 1){
return next.getKey();
}
}
return ' ';
}
2、LeetCode上可以通過,但是我個人覺得有疑問。因爲不能保證字符串裏沒有大寫的字母。如果規定了字符串裏面只有小寫字母,那下面的方法的執行效率更高。
public char firstUniqChar(String s) {
if (s.equals("")) return ' ';
//創建‘a'-'z'的字典
int[] target = new int[26];
//第一次遍歷,將字符統計到字典數組
for (int i = 0; i < s.length(); i++) {
target[s.charAt(i) - 'a']++;
}
//第二次遍歷,從字典數組獲取次數
for (int i = 0; i < s.length(); i++) {
if (target[s.charAt(i) - 'a'] == 1) return s.charAt(i);
}
return ' ';
}