#力扣 LeetCode:面試題 01.01. Is Unique LCCI #在所有 Java 提交中擊敗了 100.00% 的使用者 @FDDLC
阿新 • • 發佈:2020-12-12
技術標籤:演算法&資料結構
題目描述:
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; } }