剑指 Offer 50. 第一个只出现一次的字符 发表于 2022-04-23 LinkedHashMap123456789101112131415161718192021class Solution { public char firstUniqChar(String s) { Map<Character, Boolean> charToUniqMap = new LinkedHashMap<>(); for (int i = 0; i < s.length(); i++) { char c = s.charAt(i); if (!charToUniqMap.containsKey(c)) { charToUniqMap.put(c, Boolean.TRUE); } else { charToUniqMap.put(c, Boolean.FALSE); } } for (Map.Entry<Character, Boolean> entry : charToUniqMap.entrySet()) { if (entry.getValue()) { return entry.getKey(); } } return ' '; }} 使用 LinkedHashMap 可以避免重复扫描原字符串。 Array123456789101112131415161718192021222324252627class Solution { public char firstUniqChar(String s) { int[] countArray = new int[26]; int[] indexArray = new int[26]; Arrays.fill(indexArray, -1); for (int i = 0; i < s.length(); i++) { int offset = s.charAt(i) - 'a'; countArray[offset]++; if (indexArray[offset] == -1) { indexArray[offset] = i; } } int minIndex = Integer.MAX_VALUE; char uniqChar = ' '; for (int i = 0; i < countArray.length; i++) { if (countArray[i] == 1 && indexArray[i] < minIndex) { minIndex = indexArray[i]; uniqChar = (char) ('a' + i); } } return uniqChar; }} Reference剑指 Offer 50. 第一个只出现一次的字符