字符串问题之 去掉字符串中连续出现K个0的子串

字符串问题之 去掉字符串中连续出现K个0的子串

   字符串中刚好出现K个连续的‘O’,则把K个连续‘O’字符去除,返回处理后的字符串

    比如 str="AOOOOOBOOO"   k=3, 返回“AOOOOOB”

 

这个题的解决思路也有很多

重要的是,关键的是,如何从左到右便利str时,将正好有连续的K个‘0’字符串都找到

解题思路步骤

   1 生成两个变量。 int count 表示目前连续个‘O’的数量, 整型变量start,表示连续个‘O’出现的初始位置

   2 从左到右 遍历str, 根据此处的内容cha做不同处理

  3  如果cha是‘O’  然后看看 star = star==-1?i:start     

  4 如果char不是‘O’ 这是去掉'O'的时刻,要查看 count 等于 K不!是则删,不是则不删,最后令count=0 start=-1

  5 去‘O’的时刻是 不是‘O’的时候如果是以‘O’ 结尾的呢?! 考虑周全!需要判断 count是不是为K

废话不多说,代码贴上

 

package TT;

public class Test3 {
 
     public static String removeKZeros(String str, int k){
         
             if(str==null || k<1){
                 return str;
             }
         
            char[] chas = str.toCharArray();
            int count = 0, start =-1;
            
            for(int i=0; i!=chas.length; i++){
                 if(chas[i] =='O'){
                     count++;
                     start = start==-1 ? i : start;
                     
                 }else {
                     if(count == k){
                          while(count-- !=0){
                              chas[start++]=0;
                          }
                     }
                     count = 0;
                     start = -1;
                 }
            }
            
            if(count == k){
                while(count-- !=0){
                    chas[start++]=0;
                }
            }
            return String.valueOf(chas);
     }
    
    
    
     public static void main(String[] args){
         
         String str = "AOOOOOBOOO";
         int k = 3;
         String str1= removeKZeros(str,k);
         System.out.println(str1);
         
         
     }
     
     
     
}

 

重点在这里:

public class Test5 {
   
     public static void main(String[] args) {
         char[] x = {'A',0,0,0,'B'};
         String xString = String.valueOf(x);
         System.out.println(xString);
         System.out.println(xString.charAt(1)==0);
    }
    
}

 

 

结果:

 

我又想了个递归版:

public class Test2 {    
    public static String getRemoveRetain(String str,int k) {
        if (k<=0) {
            return "不要乱搞";
        }
        String S ="";
        String strTest = str;
        for (int i = 0; i < k; i++) {
            S+="O";
        }
        
        int record = str.indexOf(S);
        if (record  == -1) {
            return str;
        }
        else if ((record+k)>=str.length()) {
              return str.substring(0,record);
        }
        else if ((str.charAt(record+k)=='O') || (str.charAt(record+k)=='O')) {
            int j = record+k;
            while (str.charAt(j) == 'O') {
                j++;        
            }
         return    str.substring(0,j).concat(getRemoveRetain(str.substring(j), k));
        }else if (str.charAt(record+k) !='O') {
            String substring = str.substring(record+k);
         return    str.substring(0,record).concat(getRemoveRetain(substring, k));
        }
        return str;
    }
        
    
    public static void main(String[] args) {
         String s ="AOOOOOBOOOBOOO"; 
         System.out.println(getRemoveRetain(s, 3));
    }
}

 

posted @ 2017-08-14 21:22 toov5 阅读( ...) 评论( ...) 编辑 收藏
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值