给定一个字符串str,将str中连续两个字符为a的字符替换为b(一个或连续超过多个字符a则不替换)

时间:2023-01-07 08:44:30

需求:给定一个字符串str,将str中连续两个字符为a的字符替换为b(一个或连续超过多个字符a则不替换)

如:
 a 不替换
 b 不替换
 ab 不替换
 ba 不替换
 aba 不替换
 aab 替换为 bbb
 baa 替换为 bbb
 abaabaaabaa 替换为 abbbbaaabbb 中间三个a不作替换

源代码如下ReplaceTest.java:

package com.test.zhipengs;


/**
* A Question
* 给定一个字符串str,将str中连续两个字符为a的字符替换为b
* 如:
* a 不替换
* b 不替换
* ab 不替换
* ba 不替换
* aba 不替换
* aab 替换为 bbb
* baa 替换为 bbb
* abaabaaabaa 替换为 abbbbaaabbb 中间三个a不作替换
*
*
@author zhipengs
*
*/
public class ReplaceTest {

/**
* main方法
*
@param args
*/
public static void main(String[] args) {
// 测试替换方法
String str1 = "aachaadaaacaaaaaaaefgaa";
System.out.println(
"-------------------------------");
System.out.println(
"替换前:" + str1);
System.out.println(
"替换后:" + replace(str1));
String str2
= "aaachaadaaacaaaaaaaefgaaa";
System.out.println(
"-------------------------------");
System.out.println(
"替换前:" + str2);
System.out.println(
"替换后:" + replace(str2));
String str3
= "ajaayaaakaac";
System.out.println(
"-------------------------------");
System.out.println(
"替换前:" + str3);
System.out.println(
"替换后:" + replace(str3));
String str4
= "a";
System.out.println(
"-------------------------------");
System.out.println(
"替换前:" + str4);
System.out.println(
"替换后:" + replace(str4));
String str5
= "b";
System.out.println(
"-------------------------------");
System.out.println(
"替换前:" + str5);
System.out.println(
"替换后:" + replace(str5));
String str6
= "ab";
System.out.println(
"-------------------------------");
System.out.println(
"替换前:" + str6);
System.out.println(
"替换后:" + replace(str6));
String str7
= "ba";
System.out.println(
"-------------------------------");
System.out.println(
"替换前:" + str7);
System.out.println(
"替换后:" + replace(str7));
String str8
= "aa";
System.out.println(
"-------------------------------");
System.out.println(
"替换前:" + str8);
System.out.println(
"替换后:" + replace(str8));
String str9
= "aaa";
System.out.println(
"-------------------------------");
System.out.println(
"替换前:" + str9);
System.out.println(
"替换后:" + replace(str9));
String str10
= "kjgnknk";
System.out.println(
"-------------------------------");
System.out.println(
"替换前:" + str10);
System.out.println(
"替换后:" + replace(str10));
}

/**
* 具体替换方法
*
@param str
*
@return String
*/
private static String replace(String str) {
int len = str.length();
if (null == str || len <= 1) {// str为null或只有一个时直接返回
return str;
}
char[] charArray = str.toCharArray();// 将str转为字符数组
int num = 0;// 记录字符 a 的个数
for (int i = 0; i < len; i++) {
if ('a' == str.charAt(i)) {
num
++;
}
else {
num
= 0;// 一旦第i个字符不是 a 则num值立即清零
}
if ((num == 2 && (i + 1) < len && 'a' != charArray[i + 1])
|| (num == 2 && (i + 1) == len)) {// 下一个字符存在时num值为2且下一个字符不是a;遍历到字符串末尾即没有下一个字符了时num值为2即可
charArray[i - 1] = 'b';// 把当前位置和上一个位置的字符a替换为b
charArray[i] = 'b';
}
}
return new String(charArray);// 返回结果
}

}

测试结果输出如下:

-------------------------------
替换前:aachaadaaacaaaaaaaefgaa
替换后:bbchbbdaaacaaaaaaaefgbb
-------------------------------
替换前:aaachaadaaacaaaaaaaefgaaa
替换后:aaachbbdaaacaaaaaaaefgaaa
-------------------------------
替换前:ajaayaaakaac
替换后:ajbbyaaakbbc
-------------------------------
替换前:a
替换后:a
-------------------------------
替换前:b
替换后:b
-------------------------------
替换前:ab
替换后:ab
-------------------------------
替换前:ba
替换后:ba
-------------------------------
替换前:aa
替换后:bb
-------------------------------
替换前:aaa
替换后:aaa
-------------------------------
替换前:kjgnknk
替换后:kjgnknk

 

总结:一支笔一页白纸总是写不出类似的代码,但用键盘+IDE可以敲出来,这是不熟练的原因吗?~~