算法 - 小试1 - 去除字符串重复字符

目录

需求描述1 - 去除字符串中相邻重复的字符。

需求描述2 - 去除字符串中所有重复的字符(只保留第一个重复的字符)

需求描述3 - 删除字符串中所有相邻的重复串


需求描述1 - 去除字符串中相邻重复的字符。

代码:

public void initJava(){

    String str="aabbbccccdddddeeeeeeeeefff234tttdddfffbbbggg";

    String result=removeRepeatChar(str);

    Log.d("TAG","去重前----:"+str);

    Log.d("TAG","去重后----:"+result);

}


public String removeRepeatChar(String s) {

    if (s == null) {

        return "";

    }

    StringBuffer sb = new StringBuffer();

    int i = 0;

    int len = s.length();

    while (i < len) {

        char c = s.charAt(i);

        sb.append(c);

        i++;

        while (i < len && s.charAt(i) == c) {//这个是如果这两个值相等,就让i+1取下一个元素

          i++;

        }

    }

    return sb.toString();
    
}

结果:

  1. 去重前----:aabbbccccdddddeeeeeeeeefff234tttdddfffbbbggg

  2. 去重后----:abcdef234tdfbg

需求描述2 - 去除字符串中所有重复的字符(只保留第一个重复的字符)

代码:

public void initJava(){

    String str="aabbbccccdddddeeeeeeeeefff234tttdddfffbbbggg";

    removeMethod(str);

}


public void removeMethod(String s) {

    Log.d("TAG", "去重前----:" + s);

    StringBuffer sb = new StringBuffer();

    int len = s.length();

    for (int i = 0; i < len; i++) {

        char c = s.charAt(i);

        if (s.indexOf(c) ==s.lastIndexOf(c)) {
            //此字符第一次位置和最后位置一致 即肯定没有重复的直接添加

            sb.append(c);

        } else {//同理 次字符出现过多次

            int fristposition=s.indexOf(c);//次字符第一次出现的位置

            if(fristposition==i){
            //第一次出现的位置和当前位置一致 即第一次出现添加

            sb.append(c);

            }

       }

   }

   Log.d("TAG", "去重后----:" + sb.toString());

}

结果:

  1. 去重前----:aabbbccccdddddeeeeeeeeefff234tttdddfffbbbggg

  2. 去重后----:abcdef234tg

需求描述3 - 删除字符串中所有相邻的重复串

描述:

解题思路:

  1. 遍历字符串 S,对于每次遍历的字符都判断是否与字符串中索引前一位元素是否相同

  2. 相同时,通过 StringBuilder 的 delete() 方法,来删除当前字符与前一位相同的字符

  3. 注意:索引也需要减 2,否则可能出现索引越界错误

代码:

public static String removeDuplicates(String S) {
    StringBuilder sb = new StringBuilder(S);
    for (int i = 1; i < sb.length(); i++) {
        // 当前遍历字符与前一字符相同时,说明重复
        if (i > 0 && sb.charAt(i) == sb.charAt(i - 1)) {
            // 删除两个字符,索引分别为:i+1,i
            sb.delete(i - 1, i + 1);
            // 防止索引越界,遍历索引 i 也相应减 2(因删除了两个字符)
            i -= 2;
        }
    }
    return sb.toString();
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值