zoukankan      html  css  js  c++  java
  • 字符串问题之 去掉字符串中连续出现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));
        }
    }

    写法有太多了:

    public class t4 {
    
        public static String removeKo(String str, int k) {
            if (str == null || k < 1) {
                return str;
            }
            char[] chars = str.toCharArray();
            int count = 0;
            for (int i = 0 ; i< chars.length; i++){
                if (chars[i] == '0'){
                    count++;
                }
                if(chars[i] != '0' && count == k){
                    int index = k;
                    int j = i-1;
                    while (index!=0 && ((i-1)>=0)){
                        chars[j] = 0;
                        index--;
                        j--;
                    }
                    //计算完毕要清空count
                    count=0;
                }
                if (chars[i] !='0' && count != k){
                    count=0;
                }
            }
            //遍历完毕最后的判断
            if (count == k){
                int index = chars.length-1;
                int sub = k;
                //临界值为0时候已经不可以了 可以假设k为1的情况 预设
                while (sub >0){
                    chars[index--]=0;
                    sub--;
                }
            }
            return String.valueOf(chars);
        }
        public static void main(String[] args){
            String str="A000B000";
            String s = removeKo(str, 3);
            System.out.println(s);
    
        }
    }

  • 相关阅读:
    安装触摸板驱动导致系统无法开机
    TensorBoard的使用
    TensorFlow 编程基础
    在Anaconda3下安装(CPU版)TensorFlow(清华镜像源)
    C 程序
    CodeBlocks 断点调试
    数字图像处理之复原处理
    数字图像处理之频域图像增强
    数字图像处理之傅里叶变换
    算法导论中的四种基本排序
  • 原文地址:https://www.cnblogs.com/toov5/p/7360280.html
Copyright © 2011-2022 走看看