1. 程式人生 > >第一個只出現一次的字元(java版)

第一個只出現一次的字元(java版)

【題目描述】在一個字串(1<=字串長度<=10000,全部由大寫字母組成)中找到第一個只出現一次的字元,並返回它的位置。

【注意】
1.題目中描述字串長度>1, 但是在實際操作中發現,牛客輸入的測試用例中出現了空字串,即長度為0的情況,截止到發文為止,已提交糾錯申請,請注意。
2. 測試用例中出現了小寫字串的測試用例。
3. 若輸入空串,需要返回 -1。題目也未提及到。

【解題思路1】暴力解法
//1. 將字串轉換成字元陣列。
//2. 對陣列進行排序。注意排序後的陣列字元之間的相對位置已經改變。
//3. 遍歷陣列,找出只出現一次的字元。注意處理第一字元和最後一個字元的邊界情況。
//4. 將找到的字元,和未進行排序的字元陣列比較,返回它原來的位置。

import java.util.Arrays;
import java.util.ArrayList;

public class Solution {
    public int FirstNotRepeatingChar(String str) {
        if(str.length() == 1){
            return 0;
        }
        if(str == null || str.length() == 0){
            return -1;
        }
        int index=0;
        char
[] chs = str.toCharArray(); char[] chss = str.toCharArray(); ArrayList<Character> arr = new ArrayList<Character>(); Arrays.sort(chs); for(int i=0, len=chs.length; i<len; i++){ if(i==len-1 && chs[i]!=chs[i-1]){ arr.add(chs[i]); }else
if(i==0 && chs[i]!=chs[i+1]){ arr.add(chs[i]); }else{ if(i!=0 && i!=len-1 && chs[i]!=chs[i-1] && chs[i]!=chs[i+1]){ arr.add(chs[i]); } } } for(int j=0, len=chss.length; j<len; j++){ if(arr.contains(chss[j])){ index = j; break; } } return index; } }

【解題思路2】
//1. 利用雜湊表儲存每個字元出現的次數。
//2. 遍歷雜湊表,第一個出現次數為1 的字元即所求。

【原始碼2】

連結:https://www.nowcoder.com/questionTerminal/1c82e8cf713b4bbeb2a5b31cf5b0417c
來源:牛客網

import java.util.LinkedHashMap;
// use linkedhashmap to keep the order
public class Solution {
    public int FirstNotRepeatingChar(String str) {
        LinkedHashMap <Character, Integer> map = new LinkedHashMap<Character, Integer>();
        for(int i=0;i<str.length();i++){
            if(map.containsKey(str.charAt(i))){
                int time = map.get(str.charAt(i));
                map.put(str.charAt(i), ++time);
            }
            else {
                map.put(str.charAt(i), 1);
            }
        }
        int pos = -1;   
        int i=0;
        for(;i<str.length();i++){
            char c = str.charAt(i);
            if (map.get(c) == 1) {
                return i;
            } 
        }
        return pos;
    }
}

a. 注意hashmap底層實現是散列表,所以儲存是無序的。而linkedhashmap雖然底層實現也是散列表,但是有一個雙向迴圈列表來維護其插入順序。所以若第二步中遍歷的是map,則使用linkedhashmap。若像上面遍歷是使用原始字串來進行的,則無所謂。