1. 程式人生 > 其它 >#力扣 LeetCode:面試題 01.01. Is Unique LCCI #在所有 Java 提交中擊敗了 100.00% 的使用者 @FDDLC

#力扣 LeetCode:面試題 01.01. Is Unique LCCI #在所有 Java 提交中擊敗了 100.00% 的使用者 @FDDLC

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

題目描述:

https://leetcode-cn.com/problems/is-unique-lcci/submissions/

Java程式碼:

class Solution { //經過確認,只有26個小寫字母!這是本演算法的前提!
    public boolean isUnique(String astr) {
        for(int i=0,mask=0;i<astr.length();i++){
            if((mask&1<<astr.charAt(i)-'a')!=0)return false;
            mask|=1<<astr.charAt(i)-'a';
        }
        return true;
    }
}

解釋:

class Solution { //經過確認,只有26個小寫字母!這是本演算法的前提!
    public boolean isUnique(String astr) {
        int bitsSet=0; //bitsSet被初始化為0,對應的二進位制表示(32位)為:0……0(32個0,因為int佔4個位元組)
        for(int i=0;i<astr.length();i++){
            //把每個字元對映成0到25之間的某個數shiftAmount('a'對應0,'b'對應1,…,'z'對應25),然後讓1左移shiftAmount位
            int shiftAmount=astr.charAt(i)-'a';
            //比如左移2位,移位得到的數numAfterShift:(29個0)100,左移3位變成:(28個0)1000,因為numAfterShift最大可為25(對應'z'),因此最多左移25位,小於等於31,不會出現週期性迴圈(>=32才會出現)!
            //也就是說,每個字元對應一個介於0到25的數字shiftAmount,每個數字shiftAmount對應一個32位的數numAfterShift,這個numAfterShift只有1位是1,其餘31位都是0!
            int numAfterShift=1<<shiftAmount; //讓1左移shiftAmount位,得到numAfterShift
            int isVisited=bitsSet&numAfterShift; //isVisited為0表示沒被註冊過,大於0表示已被註冊
            if(isVisited!=0)return false; //之前出現過相同的numAfterShift,直接返回false
            bitsSet=bitsSet|numAfterShift; //在bitsSet中搶佔(註冊)某個位!比如'a'會搶佔右起第0位,'b’會搶佔右起第1位,‘z’會搶佔右起第25位
        }
        return true;
    }
}