不開新數組,一串英文字符串,去除重複的字符

思路

英文字符,也就是a-zA-Z
分別對應的ascii碼是 97-12265-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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章