1. 程式人生 > 實用技巧 >劍指34.第一個只出現一次的字元

劍指34.第一個只出現一次的字元

題目描述

在一個字串(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; } }