思路
英文字符,也就是a-z
,A-Z
分別對應的ascii碼是 97-122
,65-90
總共加起來48個字符,如果按照平時相反,兩層for循環,外面一層遍歷字符串,裏面一層開一個新數組,判斷當前字符在數組中有沒有,沒有就存,有就跳過
但是不讓開新數組,這時候可以考慮使用bit位。正好一個long類型有64位,我們可以讓一個字符佔一位,使用與
運算來判斷,或
運算來保存
代碼
public static void main(String[] args){
deRepeatString("aabcaAcBdACFSedfcaFdsadGhfgGFASdHFvGudfgVohjfdOdsfgGODGVBadfxcBSDFGbzZyYPpQ");
}
/**
* 給英文字符串去重
*/
public static void deRepeatString(String t){
char[] cs = t.toCharArray();
int i = 0;
//記錄字符串的位,一個字符佔一個bit位
long b = 0L;
for (char c : cs) {
int n;
if (c <= 'Z'){
//這裏將64位拆成兩半,大寫從30開始,小寫從0開始
n = c - 'A' + 30;
}else {
n = c -'a';
}
//這裏的1記住要加L,否則就是int32位的運算,會有問題
long m = 1L << n;
System.out.println("m = " + m);
//如果與運算不等於0,那肯定某個bit位都是1,是同一個字符
if ((b & m) == 0){
//不重複
cs[i++] =c;
b |=m;
}else{
//ascii碼中,0表示空字符
cs[i++] = '\0';
}
}
System.out.println(new String(cs));
}
結果:
a bc A Bd CFSe f s Gh g H v u Vo j O D x zZyYPpQ