题目描述
请实现一个函数用来找出字符流中第一个只出现一次的字符。例如,当从字符流中只读出前两个字符"go"时,第一个只出现一次的字符是"g"。当从该字符流中读出前六个字符“google"时,第一个只出现一次的字符是"l"。
输出描述:
如果当前字符流没有存在出现一次的字符,返回#字符。
方法一:使用HashMap(无序的Map)和ArrayList
package test;
//Solution: Java版的,使用一个HashMap来统计字符出现的次数,同时
// 用一个ArrayList来记录输入流,每次返回第一个出现一次的字符都是
// 在这个ArrayList(输入流)中的字符作为key去map中查找。
import java.util.*;
class Solution {
//Insert one char from stringstream
ArrayList<Character> list = new ArrayList<>();
Map<Character, Integer> map = new HashMap<>();
public void Insert(char ch){
if (map.containsKey(ch)) {
map.put(ch, (map.get(ch) + 1));
} else {
map.put(ch, 1);
list.add(ch);
}
}
//return the first appearence once char in current stringstream
public char FirstAppearingOnce(){
char c = '#';
for (int i = 0; i < list.size(); i++) {
if (map.get(list.get(i)) == 1) {
return list.get(i);
}
}
return c;
}
// for(char key : list){//foreach语句
// if(map.get(key)==1){
// c=key;
// break;
// }
// }
/*Iterator it=map.keySet().iterator();
while(it.hasNext()){
String key;
String value;
key=it.next().toString();
value=map.get(key);
System.out.println(key+"--"+value);
}*/
return c;
}
}
public class Main{
public static void main(String[] args) {
char[] a = {'g','o','o','g','l','e'};
Solution p = new Solution();
for(int i = 0; i <a.length; i++){
p.Insert(a[i]);
char b = p.FirstAppearingOnce();
System.out.println("结果:" + b);
}
}
}
方法二 :使用LinkedHashMap(有序的Map)
package test;
import java.util.Map;
import java.util.LinkedHashMap;
class Solution {
//用有序的Map:LinkedHashMap来存放char,并且记录其出现次数
Map<Character,Integer> map = new LinkedHashMap<>();
//Insert one char from stringstream
public void Insert(char ch)
{
if(!map.containsKey(ch)){
map.put(ch,1);
}else{
map.put(ch,map.get(ch)+1);
}
}
//return the first appearence once char in current stringstream
public char FirstAppearingOnce()
{
for(char ch:map.keySet()){//该方法返回map中所有key值的列表
int count = map.get(ch);
//目前第一个只出现一次的字符,返回
if(count == 1)
return ch;
}
return '#';
}
}
public class Main{
public static void main(String[] args) {
char[] a = {'g','o','o','g','l','e'};
Solution p = new Solution();
for(int i = 0; i <a.length; i++){
p.Insert(a[i]);
char b = p.FirstAppearingOnce();
System.out.println("结果:" + b);
}
}
}