找到第一个不重复的字符
例如:
a happy pig
a 重复2次
h 重复1次
p 重复3次
y 重复1次
g 重复1次
i 重复一次
编写一个返回第一个不重复字符h的方法
什么样得数据结构最适合快速查找项目?
可以使用哈希表存储每个字符及其重复的次数。
1.构建哈希表
2.迭代字符串
3.得到当前字符串并查找它重复的次数
4.是重复就忽略,继续查询下一个字符
空格重复了两次,继续下一个
然后到达h,是第一个不重复的字符,停止迭代并返回该字符
public class CharFinder {
public char findFirstNonRepeatingChar(String str){
Map<Character,Integer> map = new HashMap<>();
for(var ch:str.toCharArray()){
//如果哈希表有字符则获取该字符的值并计数,否则置为0
var count = map.containsKey(ch) ? map.get(ch):0;
map.put(ch,count+1);
}
System.out.println(map);
return 0;
}
}
CharFinder cf = new CharFinder();
cf.findFirstNonRepeatingChar("a happy pig");
show
有趣的是,这些键和字符串中的字符顺序不同,a是我们输入的第一个字符,我们也希望看到哈希表输出第一个字符为a,这完全是因为哈希表中哈希函数的映射,所以项不是按顺序添加到内存中的。
现在我们知道了每一个字符出现的频率,需要将输入的字符串再次进行迭代,在哈希表中查找每个字符,如果值为1,则返回该字符
for(var ch:str.toCharArray()){
if(map.get(ch)==1)
return ch;
}
return Character.MIN_VALUE;