请你实现一个简单的字符串替换函数。原串中需要替换的占位符为"%s",请按照参数列表的顺序一一替换占位符。若参数列表的字符数大于占位符个数。则将剩下的参数字符添加到字符串的结尾。
给定一个字符串A,同时给定它的长度n及参数字符数组arg,请返回替换后的字符串。保证参数个数大于等于占位符个数。保证原串由大小写英文字母组成,同时长度小于等于500。
请你实现一个简单的字符串替换函数。原串中需要替换的占位符为"%s",请按照参数列表的顺序一一替换占位符。若参数列表的字符数大于占位符个数。则将剩下的参数字符添加到字符串的结尾。
给定一个字符串A,同时给定它的长度n及参数字符数组arg,请返回替换后的字符串。保证参数个数大于等于占位符个数。保证原串由大小写英文字母组成,同时长度小于等于500。
"A%sC%sE",7,[B,D,F],3
"ABCDEF"
import java.util.*; public class StringFormat { public String formatString(String A, int n, char[] arg, int m) { // write code here String[] s = A.split("%s"); StringBuffer sb = new StringBuffer(); for (int i=0;i<arg.length;i++){ if (i<s.length){ sb.append(s[i]); } sb.append(arg[i]); } return sb.toString(); } }感觉还是用replace比较好
import java.util.*; public class StringFormat { public String formatString(String A, int n, char[] arg, int m) { // write code here for (int i=0 ;i<arg.length;i++){ if (A.contains("%s")){ A = A.replaceFirst("%s",String.valueOf(arg[i])); }else { A = A+arg[i]; } } return A; } }
public class Main { //将输入的字符串转化为一个String类型的数组public static String []detele(String a) {
import java.util.*; public class StringFormat { public String formatString(String A, int n, char[] arg, int m) { // write code here String[] format = A.split("%s"); StringBuffer sb = new StringBuffer(); if(format.length>1){ for(int i = 0;i<format.length-1;i++){ sb.append(format[i]); sb.append(arg[i]); } sb.append(format[format.length-1]); if(arg.length>format.length-1){ for(int i = format.length-1;i<arg.length;i++){ sb.append(arg[i]); } } }else{ sb.append(format[0]); for(int i = 0;i<arg.length;i++){ sb.append(arg[i]); } } return sb.toString(); } }
时间复杂度o(n)
利用String.split("%s")将字符串a分割
使用StringBuilder(或StringBuffer)一个一个的append
需要注意的是arg的长度要大于等于分割出来的arr长度
所以for循环中要加上一个判断
否则append arr[i]的时候会出现数组越界异常
import java.util.*;
public class StringFormat {
public String formatString(String a, int n, char[] arg, int m) {
// write code here
String[] arr = a.split("%s");
StringBuilder sb = new StringBuilder();
for (int i = 0; i < arg.length; i++) {
if (i < arr.length)
sb.append(arr[i]);
sb.append(arg[i]);
}
return sb.toString();
}
}
import java.util.*; public class StringFormat { public String formatString(String A, int n, char[] arg, int m) { StringBuffer sb=new StringBuffer(); int count=0; for(int i=0;i<n;i++){ if(i+1<n&&A.charAt(i)=='%'&&A.charAt(i+1)=='s'){ sb.append(arg[count]); count++; i++; }else{ sb.append(A.charAt(i)); } } for(int j=count;j<m;j++){ sb.append(arg[j]); } return sb.toString(); } }
import java.util.*; public class StringFormat { public String formatString(String A, int n, char[] arg, int m) { // write code here int i = 0; while(A.contains("%s")) { int start = A.indexOf("%s"); A = replaceStr(A, start, arg[i]); // System.out.println("AA=="+A); i++; } if(i != m) { for(int j=i; j<m; j++) { A = A.concat(arg[j]+""); } } return A; } public String replaceStr(String str,int index, char c) { return str.substring(0, index).concat(c+"").concat(str.substring(index+2)); } }
//处理字符串,转成StringBuilder import java.util.*; public class StringFormat { public String formatString(String A, int n, char[] arg, int m) { // write code here StringBuilder sb =new StringBuilder(A); int k=0; for(int i=0;i<sb.length()-1;i++){ if(sb.charAt(i)=='%'&& sb.charAt(i+1)=='s'){ sb.replace(i,i+2,arg[k++]+""); //String.valueOf() } } if(k<arg.length){//==时,刚好替换完 for(int i=k;i<arg.length;i++){ sb.append(arg[i]); } } return new String(sb); } }
import java.util.*; public class StringFormat { public String formatString(String A, int n, char[] arg, int m) { // write code here StringBuilder sb = new StringBuilder(); int j=0; for (int i=0; i<n; i++) { if (A.charAt(i) == '%') { sb.append(arg[j++]); i++; } else sb.append(A.charAt(i)); } while (j<m) sb.append(arg[j++]); return sb.toString(); } }
import java.util.*; public class StringFormat { public String formatString(String A, int n, char[] arg, int m) { for (int i = 0; i < arg.length; i ++ ) { if(A.contains("%s")) { int index = A.indexOf("%s"); A = A.substring(0, index) + arg[i] + A.substring(index + 2); } else A += arg[i]; } return A; } }
//题目比较简单,常规做法可能就是替换操作,但是用一个字符替换两个字符,造成的代价就是 //替换完成之后后面的字符全部要向前移动一位。 //所以对于长度为n的字符串来说时间复杂度为O(n2); //其实可以优化到O(n)的时间复杂度,那就是用两个指针 //第一个指针指向给定的字符串,然后依次遍历 //第二个指针指向一个新的字符串,如果第一个指针检测到%s那么就在新的字符串里面复制arg里面的值 //否则的话就复制给定的字符串的值。思路很简单,具体代码如下。 public String formatString(String A, int n, char[] arg, int m) { StringBuffer sb = new StringBuffer(); int j = 0 ; for(int i = 0 ; i< n ; i++){ if(A.charAt(i)=='%'){ sb.append(String.valueOf(arg[j])); j++; }else if(A.charAt(i)=='s'){ sb.append(""); }else{ sb.append(String.valueOf(A.charAt(i))); } } while(j<m){ sb.append(String.valueOf(arg[j])) ; j++; } return sb.toString(); }