1. 程式人生 > 其它 >#力扣 LeetCode劍指 Offer 50. 第一個只出現一次的字元 @FDDLC

#力扣 LeetCode劍指 Offer 50. 第一個只出現一次的字元 @FDDLC

技術標籤:演算法&資料結構

題目描述:

https://leetcode-cn.com/problems/di-yi-ge-zhi-chu-xian-yi-ci-de-zi-fu-lcof/

Java程式碼:

class Solution {
    public char firstUniqChar(String s) {
        char answer=' ';
        int[] count=new int['z'+1]; //可以只用26個int,這裡以空間換時間
        for(int i=0;i<s.length();i++)count[s.charAt(i)]++;
        for(int i=0;i<s.length();i++){
            if(count[s.charAt(i)]==1){
                answer=s.charAt(i);
                break;
            }
        }
        return answer;
    }
}

Java程式碼二:

class Solution {
    public char firstUniqChar(String s) {
        char answer=' ';
        int[] count=new int['z'+1]; //可以只用26個int,這裡以空間換時間
        for(int i=0,l=s.length();i<l;i++)count[s.charAt(i)]++;
        for(int i=0,l=s.length();i<l;i++){
            if(count[s.charAt(i)]==1){
                answer=s.charAt(i);
                break;
            }
        }
        return answer;
    }
}

每次呼叫s.length()更耗時間,故優化之。

Java程式碼三:

import java.util.LinkedHashSet;
import java.util.LinkedList;

class Solution {
    public char firstUniqChar(String s) {
        int[] count=new int['z'+1],order=new int[Math.min(s.length(),26)]; //count可以只用26個int,這裡以空間換時間
        for(int i=0,l=s.length(),ch,oi=0;i<l;i++){
            ch=s.charAt(i);
            if(count[ch]==0)order[oi++]=ch; //order用於給每個字母首次出現的位置排序
            count[ch]++;
        }
        for(int i=0;i<order.length;i++){
            if(count[order[i]]==1)return (char)order[i];
        }
        return ' ';
    }
}