1. 程式人生 > >【演算法】字串中找出第一個不重複的字元

【演算法】字串中找出第一個不重複的字元

思想:

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!");
	}
}