【演算法】字串中找出第一個不重複的字元
阿新 • • 發佈:2019-02-01
思想:
1、採用兩個int整數,firstHappen整數記錄字元對應ascii碼對應位,如果出現則為1,不出現預設為0;
2、reHappen整數記錄字元對應ascii碼對應位,如果重複出現的為1,否則預設為0;
3、然而對於任意字元,ascii碼是0-255,不可能有一個int整數能表示一個最大為255位的數,因為int在32位機只能最大表示32位整數,所以,此時需要用到firstHappen[8],和reHappen[8],分別為8元素的陣列來表示,陣列下標表示字元ascii碼值/32表示迴圈左移時,出現的第幾次迴圈,ascii碼%32表示,該次迴圈中左移幾位;
4、最後再對字串做一次掃描,只要第一個不在reHappen中出現的字元就是第一個不出現重複的字元。
5、時間複雜度o(n),空間複雜度o(1)
於是整理可得如下程式
import java.util.Scanner; //找出第一個不重複的字元 public class GetFirstSingleHappen { public static void main(String[] args) { int[] firstHappen= {0,0,0,0,0,0,0,0};//初始化每個數都為0 int[] reHappen ={0,0,0,0,0,0,0,0}; int asci=0,i; Scanner scan=new Scanner(System.in); String str = scan.nextLine(); for( i=0;i<str.length();i++){ asci= str.charAt(i); if((firstHappen[asci/32]&(1<<(asci%32)))==0){//第一次出現 firstHappen[asci/32]=firstHappen[asci/32]|(1<<(asci%32));//將firstHappen對於迴圈次數的那個整數對於左移為置為1 }else{//重複出現 reHappen[asci/32]=reHappen[asci/32]|(1<<(asci%32));//將reHappen對於迴圈次數的那個整數對於左移為置為1 } } for(i=0;i<str.length();i++){ asci=str.charAt(i); if((reHappen[asci/32]&(1<<(asci%32)))==0){//如果在重複數中出現,則是第一個不重複的字元 break; } } if(i<str.length()) System.out.println((char)asci); else System.out.println("No Char!"); } }