不开新数组,一串英文字符串,去除重复的字符

思路

英文字符,也就是a-zA-Z
分别对应的ascii码是 97-12265-90
总共加起来52个字符,如果按照平时相反,两层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';
      }
     
      //左移运算,将b的n位置的bit位变成1
      //这里的1记住要加L,否则就是int32位的运算,会有问题
      long m = 1L << n;
      System.out.println("m = " + m);
      //如果与运算等于0,说明在这个bit位上原来是0,也就是原来没有遍历过这个字母
      if ((b & m) == 0){
        //不重复
        cs[i++] =c;
        //或运算,将b在该bit位的0变成1,表示已经遍历过这个字母
        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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值