剑指 Offer 50. 第一个只出现一次的字符
题目要求
在字符串 s 中找出第一个只出现一次的字符。如果没有,返回一个单空格。 s 只包含小写字母。
我的思考
使用无序的哈希表(HashMap)和有序的哈希表(LinkedHashMap)都能解决此问题,但是,我们还是使用无序的哈希表会更方便一些。
思路:
把字符串变量装入有序的哈希表,键为单个字符,value为出现的次数。
装在完成后只需要遍历这个有序哈希表,第一次出现的且为1次的字符就是我们要的(因为是有序的哈希表,装入的顺序和我们字符串的原始顺序相同的)
我的代码
package jianzhioffer;
import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.Map;
/**
* @author jiyongjia
* @create 2020/6/25 - 13:57
* @descp: 使用有序的LinkedHashMap解决
*/
public class P12_fisrtApperStr {
public char firstUniqChar(String s) {
LinkedHashMap<Character,Integer> linkedHashMap = new LinkedHashMap<Character,Integer>();
//1 把字符串按照key为字符,value为次数装入有序的hashMap
char[] chars = s.toCharArray();
for (char aChar : chars) {
boolean b = linkedHashMap.containsKey(aChar);
if (!b){
linkedHashMap.put(aChar,1);
}else {
Integer integer = linkedHashMap.get(aChar);
integer++;
linkedHashMap.put(aChar,integer);
}
}
//2 直接从LinkedHashMap中拿到第一个value为1 的字符即可。
Iterator<Map.Entry<Character, Integer>> iterator = linkedHashMap.entrySet().iterator();
while (iterator.hasNext()){
Map.Entry<Character, Integer> entry = iterator.next();
if (entry.getValue()==1){
return entry.getKey();
}else {
continue;
}
}
//3 走出while循环,没返回的话,就返回未找到
return ' ';
}
}