1. 程式人生 > 其它 >387. 字串中的第一個唯一字元(Java)

387. 字串中的第一個唯一字元(Java)

387. 字串中的第一個唯一字元

給定一個字串,找到它的第一個不重複的字元,並返回它的索引。如果不存在,則返回 -1。
在這裡插入圖片描述
思路:
遍歷字串並用雜湊表記錄每個字元出現的次數,由於本題目中的字串只包含小寫字母,因此使用長為26的陣列存每個字母出現的次數。
再次遍歷該字串,返回第一個出現次數為1的字元的索引
有出現次數均大於1,則返回-1.
時間複雜度O(N)
空間複雜度O(26)
注:陣列完成初始化後,記憶體空間中針對該陣列的各個元素就有個一個預設值

        基本資料型別的整數型別(byte、short、int、long)預設值是0;

        基本資料型別的浮點型別(float、double)預設值是0.0;

        基本資料型別的字元型別(char)預設值是'\u0000';

        基本資料型別的布林型別(boolean)預設值是false;

        型別的引用型別(類、陣列、介面、String)預設值是null.
class Solution {
    public int firstUniqChar(String s) {
		int[] count=new int[26];//java靜態初始化,int型別初始值為0
		//遍歷字串,記錄每個字元出現的次數
		int i;
		for(i=0;i<s.length();i++) {
			count[s.charAt(i)-'a']++;
		}
		//遍歷字串,返回第一個計數為0的字元的位置
		for(i=0;i<s.length();i++) {
			if(count[s.charAt(i)-'a']==1)
				return i;
		}
return -1; } }

在這裡插入圖片描述
用雜湊表計數
空間複雜度小於用陣列計數。

public int firstUniqChar(String s) {
        Map<Character, Integer> map = new HashMap();
        char[] chars = s.toCharArray();
        //先統計每個字元的數量
        for (char ch : chars) {
            map.put(ch, map.getOrDefault(ch, 0) + 1);
        }
        //然後在遍歷字串s中的字元,如果出現次數是1就直接返回
for (int i = 0; i < s.length(); i++) { if (map.get(chars[i]) == 1) { return i; } } return -1; }

Map.getOrDefault(Object key, V defaultValue)方法的作用是:
當Map集合中有這個key時,就使用這個key對應的值;   
如果沒有就使用預設值defaultValue。