字符串中刚好出现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); } }