new 字符流中第一个不重复的字符

使用HashMap

使用有序的LinkedHashMap 按输入顺序输出

HashMap和LinkedHashMap区别

HashMap无序,LinkedHashMap 按输入顺序存储

import java.util.*;
public class Solution {
    //Insert one char from stringstream
    Map<Character,Integer > map=new LinkedHashMap<>();
    public void Insert(char ch)
    {
        if(map.containsKey(ch)){
            map.put(ch,map.get(ch)+1);
        }
        else 
            map.put(ch,1);
    }
  //return the first appearence once char in current stringstream
    public char FirstAppearingOnce()
    {
        for(Map.Entry<Character,Integer > set:map.entrySet()){
            if(set.getValue()==1)
                return set.getKey();
        }
        return '#'; //char型要加单引号‘ ’
    }
}

遍历hashmap

for(Map.Entry<Character,Integer > set:map.entrySet()){
     if(set.getValue()==1)
          return set.getKey();
}

按输入顺序遍历hashmap

  1. 用上面的LinkedListMap
    用普通的遍历方法即可
  2. 用普通的HashMap
    用ArrayList数组记录顺序 到时候遍历数组 找map对应的value
import java.util.*;
public class Solution {
    //Insert one char from stringstream
    HashMap<Character,Integer>  map = new HashMap<> (); 
    ArrayList<Character> list=new ArrayList<>();
    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()
    {
        for(char key:list){
            if(map.get(key)==1)
                return key;
        } 
        return '#';
    }
}

注意:

for(char key:list){
    if(map.get(key)==1)
         return key;
} 

格式注意!!!

  1. 用数组模拟hashmap
    用stringbuffer记录输入字符串 方便遍历map中的值

用一个数组模拟HashMap

一个字符占8位,因此不会超过256个,可以申请一个256大小的数组来实现一个简易的哈希表。时间复杂度为O(n),空间复杂度O(n)。

public class Solution {
    //Insert one char from stringstream
    int[] ans = new int[256];
    
    StringBuffer s=new StringBuffer(); 
    
    public void Insert(char ch)
    {
        s.append(ch);
        if(ans[ch]==0)
            ans[ch]=1;
        else
            ans[ch]++;
    }
  //return the first appearence once char in current stringstream
    public char FirstAppearingOnce()
    {
        char[] res=s.toString().toCharArray(); //先转换为字符串再转化为数组
        for(char r:res){
            if(ans[r]==1)
                return r;
        }
        return '#';
    }
}

String、StringBuffer、字符数组转换

你可能感兴趣的:(ArrayList,HashMap,字符串)