剑指offer50_第一个只出现一次的字符

题目描述

  1. 请实现一个函数用来找出字符流中第一个只出现一次的字符。例如,当从字符流中只读出前两个字符"go"时,第一个只出现一次的字符是"g"。当从该字符流中读出前六个字符“google"时,第一个只出现一次的字符是"l"。

输出描述

  1. 如果当前字符流没有存在出现一次的字符,返回#字符。

解题思路

  1. 采用散列表存储,键存储的是字符,值存储的是字符的次数
  2. 因为是数据流读入要保证数据的顺序性,因此我采用LinkedHashMap实现,HashMap是无序的,但LinkedHashMap是有序表,因此可以满足要求
  3. 静态代码块用于初始化map
  4. 插入的过程就是检索是否存在这个key,存在就将值加1,不存在就将put值1进去
  5. 取出的过程就是从头遍历,然后找到第一个value值是1的将其返回

Java源代码

import java.util.*;
public class Solution {
    private static Map map;
    {
        map = new LinkedHashMap<>();
    }
    //Insert one char from stringstream
    public void Insert(char ch)
    {
        if (map.containsKey(ch)) {
            int temp = map.get(ch);
            map.put(ch, temp+1);
        }
        else map.put(ch, 1);
    }
  //return the first appearence once char in current stringstream
    public char FirstAppearingOnce()
    {
        for (Map.Entry entry : map.entrySet()) {
            if (entry.getValue()==1) return entry.getKey(); 
        }
        return '#';
    }
}

你可能感兴趣的:(剑指offer50_第一个只出现一次的字符)