【剑指offer】50.第一个出现一次的字符

50.第一个出现一次的字符

面试题50. 第一个只出现一次的字符

难度简单14

在字符串 s 中找出第一个只出现一次的字符。如果没有,返回一个单空格。

示例:

s = "abaccdeff"
返回 "b"

s = "" 
返回 " "

1.哈希表

/*
*1.哈希表
 a.使用hashmap来存储 key为字符,value为true or  false 
   1)true -> 该字符为一个
   2) false -> 该字符不为一个
 b.loop map 找到第一个数量为1的字符 return
 c.直接 return ''; 
 time : O(n)
 space : O(n)
*/
public char firstUniqChar(String s) {
    Map<Character,Boolean> dataMap = new HashMap<>();
    char [] chs = s.toCharArray();
    for(char ch: chs){
        dataMap.put(ch,!dataMap.containsKey(ch));
    }

    for(char ch : chs){
        if(dataMap.get(ch))
            return ch;
    }
    return ' ';
}

2.有序hash表

/*
    * 2.有序hash表
      思路:hash表有去重的特点,当数据比较大的时候 我们直接从hash中查找第一个value为true的值就可以了。
      time : O(n) 而前者为O(2n) 
    */
    public char firstUniqChar(String s) {
        Map<Character, Boolean> dic = new LinkedHashMap<>();
        char[] sc = s.toCharArray();
        for(char c : sc)
            dic.put(c, !dic.containsKey(c));
        for(Map.Entry<Character, Boolean> d : dic.entrySet()){
           if(d.getValue()) return d.getKey();
        }
        return ' ';
    }
posted @ 2020-05-01 09:24  qxlxi  阅读(124)  评论(0编辑  收藏  举报