面试遇到的一道题:在一个小写字母组成的字符串里,把连续出现的2个“aa”替换为“bb”,多于或者少于2个都不行。
实现语言为Java
public static final char DEST_CHAR= 'a';
public static final int REPEAT_NO = 2;
/**
* 替换字符串里的一个子字符串,该字符串是重复REPEAT_NO次的DEST_CHAR,不能大于等于,比如:
* 替换2个为b
* aaab,不用换
* aabaaadfaa, 替换bbbaaadfbb
* @param str 原始需处理字符串
* @return 处理成功字符串
*/
public String replace(String str) {
StringBuilder sourceStr = new StringBuilder(str + "b"); //添加多一个目标替换字符,方便最后一遍遍历,结束后再去掉
int destCharNo = 0; //重复目标字母个数
int destCharBegin = 0; //发现目标字母的其实位置
int strLen = sourceStr.length();
for(int index = 0; index < strLen; index++) {
if(sourceStr.charAt(index) == DEST_CHAR) {
if(destCharNo == 0){
destCharBegin = index;
}
destCharNo++;
} else {
if((destCharBegin + REPEAT_NO) == index //到了下一个才能发现当前是否重复了REPEAT_NO次
&& destCharNo == REPEAT_NO) {
sourceStr.replace(destCharBegin, index, "bb");
}
destCharNo = 0; //重置记录状态
destCharBegin = 0;
}
}
sourceStr.deleteCharAt(strLen - 1); //去除最后一个添加字符
return sourceStr.toString();
}