劍指34.第一個只出現一次的字元
阿新 • • 發佈:2020-08-19
題目描述
在一個字串(0<=字串長度<=10000,全部由字母組成)中找到第一個只出現一次的字元,並返回它的位置, 如果沒有則返回 -1(需要區分大小寫).(從0開始計數)思路
建立雜湊表,鍵值key為字元,值value為出現次數。第一遍掃描:對每個掃描到的字元的次數加一;第二遍掃描:對每個掃描到的字元通過雜湊表查詢次數,第一個次數為1的字元即為符合要求的輸出。 思路1:使用Java內建的HashMap 思路2:用陣列代替Map。 由於字元(char)是長度為8的資料型別,共有256中可能,因此雜湊表可以用一個長度為256的陣列來代替,陣列的下標相當於鍵值key,對應字元的ASCII碼值;陣列的值相當於雜湊表的值value,用於存放對應字元出現的次數。解法1
import java.util.*; public class Solution { public int FirstNotRepeatingChar(String str) { if (str == null || str.length() == 0) return -1; HashMap<Character,Integer> map = new HashMap<>(); for (char c : str.toCharArray()){ map.put(c,map.getOrDefault(c,0)+ 1); } for (int i = 0; i < str.length(); i++) { if (map.get(str.charAt(i)) == 1) return i; } return -1; } }
解法2
import java.util.*; public class Solution { public int FirstNotRepeatingChar(String str) { if (str == null|| str.length() == 0) return -1; int[] arr = new int[256]; Arrays.fill(arr,0); // 不初始化也能AC for (int i = 0; i < str.length(); i++) { arr[str.charAt(i)]++;// 很關鍵,字元的ASCII碼 } for (int i = 0; i < str.length(); i++) { // 注意是對原字串遍歷,因為要返回第一個出現的字元 if (arr[str.charAt(i)] == 1) return i; } return -1; } }