LeetCode算法之 第一個只出現一次的字符

一、問題描述:

在字符串 s 中找出第一個只出現一次的字符。如果沒有,返回一個單空格。

示例:

s = "abaccdeff"
返回 "b"

s = "" 
返回 " "

二、解決思路:

1、LinkHashMap

public char firstUniqChar(String str) {
      if (str == null || str.equals("")){
            return ' ';
        }
        //LinkedHashMap可以保證元素的有序性,Integer記錄元素中每個字符的個數
        Map<Character,Integer> map = new LinkedHashMap<>();
        for(int i=0;i<str.length();i++){
           char c = str.charAt(i);
           if(map.containsKey(c)){
               map.put(c,(map.get(c)+1));
           }else{
               map.put(c,1);
           }

        }

        //遍歷出第一個個數爲1的字符並返回
        Iterator<Map.Entry<Character,Integer>> iterator = map.entrySet().iterator();
        while(iterator.hasNext()){
            Map.Entry<Character, Integer> next = iterator.next();
            if (next.getValue() == 1){
                return next.getKey();
            }
        }

        return ' ';

    }

2、LeetCode上可以通過,但是我個人覺得有疑問。因爲不能保證字符串裏沒有大寫的字母。如果規定了字符串裏面只有小寫字母,那下面的方法的執行效率更高。

 public char firstUniqChar(String s) {

       if (s.equals("")) return ' ';
        //創建‘a'-'z'的字典
        int[] target = new int[26];
        //第一次遍歷,將字符統計到字典數組
        for (int i = 0; i < s.length(); i++) {
            target[s.charAt(i) - 'a']++;
        }
        //第二次遍歷,從字典數組獲取次數
        for (int i = 0; i < s.length(); i++) {
            if (target[s.charAt(i) - 'a'] == 1) return s.charAt(i);
        }

        return ' ';

    }

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章