题目
请你实现一个简单的字符串替换函数。原串中需要替换的占位符为"%s",请按照参数列表的顺序一一替换占位符。若参数列表的字符数大于占位符个数。则将剩下的参数字符添加到字符串的结尾。
给定一个字符串A,同时给定它的长度n及参数字符数组arg,请返回替换后的字符串。保证参数个数大于等于占位符个数。保证原串由大小写英文字母组成,同时长度小于等于500。
测试样例:
"A%sC%sE",7,['B','D','F']
返回:"ABCDEF"
解答
1.原始解法
这题同样是一题使用字符串方法的题目,不过我没有想到,使用了原始思维去解题,当发现"%s",进行替换,每次替换完之后,两个数组向前进位一格,当没有"%s"的时候,如果arg数组还有剩余就将两个数组拼接。
import java.util.*;
public class StringFormat {
public String formatString(String A, int n, char[] arg, int m) {
// write code here
char[] chc = A.toCharArray();
for(int i = 0;i < chc.length - 1;i++){
if(chc[i] == '%'&& chc[i + 1] == 's'){
chc[i] = arg[0];
for(int k = i + 1;k < chc.length - 1;k++){
chc[k] = chc[k + 1];
}
n--;
for(int j = 0;j < arg.length - 1;j++){
arg[j] = arg[j + 1];
}
m--;
}
}
A = new String(chc);
A = A.substring(0,n);
if(arg.length > 0){
String B = new String(arg);
B = B.substring(0,m);
return A + B;
}
else{
return A;
}
}
}
2.String类解法
最佳的解法是indexOf和replaceFirst两个方法去实现,通过indexOf的方法去定位计数,然后通过String.valueOf将字符数组转换成字符串,使用replaceFirst去替换。
替换完之后,如果发现arg还存在元素,则将arg加入到字符串中。
链接:https://www.nowcoder.com/questionTerminal/f094aed769d84cf3b799033c82fc1bf6
来源:牛客网
public String formatString(String A, int n, char[] arg, int m) {
int i = 0;
while (A.indexOf("%s") >= 0) {
A = A.replaceFirst("%s", String.valueOf(arg[i]));
i++;
}
while (i < m) {
A += arg[i];
i++;
}
return A;
}
3.StringBuffer解法
除此之外,还可以用字符串分割的方法以及StringBuffer(字符序列)去解题,然后存储到一个数组中,然后遍历这个数组,代码如下:
链接:https://www.nowcoder.com/questionTerminal/f094aed769d84cf3b799033c82fc1bf6
来源:牛客网
public String formatString(String A, int n, char[] arg, int m) {
// write code here
String[] AArr = A.split("%s");
StringBuffer buffer = new StringBuffer();
int i = 0;
for (String str : AArr) {
if (str.length() == 0) {
buffer.append(arg[i]);
} else {
buffer.append(str + arg[i]);
}
i++;
}
while (i < m) {
buffer.append(arg[i]);
i++;
}
return buffer.toString();
}