请你实现一个简单的字符串替换函数。原串中需要替换的占位符为"%s",请按照参数列表的顺序一一替换占位符。若参数列表的字符数大于占位符个数。则将剩下的参数字符添加到字符串的结尾。
给定一个字符串A,同时给定它的长度n及参数字符数组arg,请返回替换后的字符串。保证参数个数大于等于占位符个数。保证原串由大小写英文字母组成,同时长度小于等于500。
请你实现一个简单的字符串替换函数。原串中需要替换的占位符为"%s",请按照参数列表的顺序一一替换占位符。若参数列表的字符数大于占位符个数。则将剩下的参数字符添加到字符串的结尾。
给定一个字符串A,同时给定它的长度n及参数字符数组arg,请返回替换后的字符串。保证参数个数大于等于占位符个数。保证原串由大小写英文字母组成,同时长度小于等于500。
"A%sC%sE",7,[B,D,F],3
"ABCDEF"
public String formatString(String A, int n, char[] arg, int m) { StringBuilder res = new StringBuilder(); //count对应arg的查询下标 int count = 0; for(int i = 0 ; i<A.length(); i ++){ //利用Ascll码表对应的数值进行逻辑判断 if( A.charAt(i) ==37 && A.charAt(i+1) ==115 ){ if(count < m){ res.append(arg[count++]); //跳过's'字符的遍历,进入下一个字符的匹配 i++; } }else{ res.append(A.charAt(i)); } } //遍历完了字符串A后,仍未超过给定的arg字符个数之前,将剩余arg字符加到最后 while(count<m){ res.append(arg[count]); count++; } return res.toString(); }
#include <iostream> #include <vector> #include <string> using namespace std; string EVE(string &a, int n, vector<char> &v1, int m) { if (n == 0) return a; string Final; int i = 0; int j = 0; for (;i != n;++i) { if (a[i] == '\0') break; if (a[i] == '%'&&a[i + 1] == 's') { Final += v1[j]; ++i; ++j; } else Final += a[i]; } if (j < m) { for (int c = j ;c != m;++c) Final += v1[c]; } for (int i = 0;i != Final.size();++i) cout << Final[i] << endl; return Final; } void main() { string a = "A%sC%sE"; vector<char> v2 = { 'B','D','M','k' }; EVE(a, 8, v2, 4); } 望大神批评指正!
class StringFormat {public:string formatString(string A, int n, vector<char> arg, int m) {// 不调用类函数的方法,先算最后字符串的大小,再逐个填充;避免超出内存限制int count = 0;for(int i = 0;i<n;i++){if(A[i]=='%' && i < n-1 && A[i+1]=='s') count++;}int newLen = n-count*2+m;string ret = string(newLen,'0');int index = 0;int j = 0;for(int i = 0; i<n;i++){if(A[i]=='%' && A[i+1]=='s'){ret[j++] = arg[index++];i++;}else{ret[j++] = A[i];}}while(index<m){ret[j++] = arg[index++];}return ret;}};
import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner in = new Scanner(System.in); while(in.hasNext()){ String str=in.next(); String[] strArr01 = str.split(",\\["); int ostrLen = Integer.valueOf((strArr01[0].split(","))[1]); String oStr=(strArr01[0].split(","))[0].substring(1, ostrLen+1); //String[] strArr02 = str.split("\\],"); //int tstrLen = Integer.valueOf(strArr02[1]); String tStr = (strArr01[1].split("'\\]"))[0].substring(1); String[] tstrArr = tStr.split("','"); int tstrLen = tstrArr.length; // System.out.println(oStr+"----"+ostrLen); // System.out.println(tStr+"----"+tstrLen); //判断 %s 有多少个 // String[] ostrArr = oStr.split("%s");//不推荐使用,因为会出现很多种情况 int fromIndex=0,count=0,subfrom=0; StringBuffer rs=new StringBuffer(""); while((fromIndex=oStr.indexOf("%s", fromIndex))>-1){ // System.out.println(fromIndex); rs.append(oStr.substring(subfrom, fromIndex)+tstrArr[count]); fromIndex+=2; subfrom=fromIndex; count++; } //加上剩余的oStr字符串 rs.append(oStr.substring(subfrom)); //System.out.println(count); //剩余个数 int plusLen=tstrLen-count; //System.out.println(plusLen); //加上剩余的tStr字符串 if(plusLen>0){ for(int i=count;i<tstrLen;i++){ rs.append(tstrArr[i]); } } System.out.println(rs); } } }
StringBuffer sb=new StringBuffer();
}
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; }第二种方法的思路通过字符串分割split 方法,把字符串中不是%s的分割出来,存储到数组中,然后遍历这个数组,进行追加参数,但是有一点需要注意字符的开始字符为%s,这样再数组的第一个位置为空串,进行特殊判断即可。这种方法的有点是有效的利用了内存,减少了很多冗余的字符生成。
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(); }
public String formatString(String A, int n, char[] arg, int m) { // write code here Pattern pattern = Pattern.compile("%s"); Matcher matcher = pattern.matcher(A); StringBuffer buffer = new StringBuffer(); int i = 0; boolean result = matcher.find(); while (result) { matcher.appendReplacement(buffer, String.valueOf(arg[i])); result=matcher.find(); i++; } matcher.appendTail(buffer); while (i < m) { buffer.append(arg[i]); i++; } return buffer.toString(); }
string formatString(string A, int n, vector<char> arg, int m) { // write code here int pos = A.find_first_of("%s"); int i = 0; while (pos!=string::npos) { A.replace(pos, 2, 1, arg[i++]); pos = A.find_first_of("%s"); } while (i<m) { A.push_back(arg[i++]); } return A; }
// 该问题可以在O(n)时间内处理完毕,如下。 string formatString(string A, int n, vector<char> arg, int m) { // write code here int i = 0, j = 0, k = 0; while(i < n){ if(A[i] == '%' && i + 1 < n && A[i + 1] == 's'){ A[j++] = arg[k++]; i += 2; }else{ A[j++] = A[i++]; } } while (k < m){ if (j < n) A[j++] = arg[k++]; else A.push_back(arg[k++]); } if (j < n) A[j] = '\0'; 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(); }
class StringFormat { public: string formatString(string A, int n, vector<char> arg, int m) { // write code here string h; int j=0; for(int i=0;i<n;i++) { if(A[i]=='%'&&A[i+1]=='s') { h=h+arg[j]; i++; j++; } else { h=h+A[i]; } } if(j<m) { h=h+arg[j]; j++; } return h; } };
//处理字符串,转成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(); } }
class StringFormat { public: string formatString(string A, int n, vector<char> arg, int m) { string ans; int index = 0; for (int i = 0; i < A.size(); i++) { if(A[i]=='%' && A[i+1]=='s'){ ans.push_back(arg[index++]); i++; } else ans.push_back(A[i]); } while(index < m) ans.push_back(arg[index++]); return ans; } };
import java.util.*; public class StringFormat { public String formatString(String A, int n, char[] arg, int m) { // write code here String[] strArr = A.split("%s"); StringBuilder sb = new StringBuilder(); int i = 0, j = 0; while(i < strArr.length && j < m){ if(A.startsWith(strArr[0])){ sb.append(strArr[i++]); sb.append(arg[j++]); }else{ sb.append(arg[j++]); sb.append(strArr[i++]); } } while(j < m) sb.append(arg[j++]); return sb.toString(); } }