首页 > 试题广场 >

字符串替换

[编程题]字符串替换
  • 热度指数:29607 时间限制:C/C++ 3秒,其他语言6秒 空间限制:C/C++ 32M,其他语言64M
  • 算法知识视频讲解

请你实现一个简单的字符串替换函数。原串中需要替换的占位符为"%s",请按照参数列表的顺序一一替换占位符。若参数列表的字符数大于占位符个数。则将剩下的参数字符添加到字符串的结尾。

给定一个字符串A,同时给定它的长度n及参数字符数组arg,请返回替换后的字符串。保证参数个数大于等于占位符个数。保证原串由大小写英文字母组成,同时长度小于等于500。


示例1

输入

"A%sC%sE",7,[B,D,F],3

输出

"ABCDEF"
这个貌似有问题 如果参数列表比String数组少一个,就会漏掉末尾的,但是提交之后 通过了 不知道是不是用例没考虑到这种情况
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;
    }
}



发表于 2020-02-10 16:37:35 回复(0)
import java.util.Scanner;
public class Main {
//将输入的字符串转化为一个String类型的数组
    public static String []detele(String a) {
        String b="";
        for(int i=0;i<a.length();i++) {
            if(a.charAt(i)!='"'&&a.charAt(i)!=']'&&a.charAt(i)!='['&&a.charAt(i)!='\'') {
                b+=a.charAt(i);
            }
        }
        return b.split(",");
    }
    public static void main(String[] args) {
        Scanner in=new Scanner(System.in);
        while(in.hasNext()) {
        String s=in.next();
        String []t=detele(s);
        int g=2;
        String []arr=new String[250];
        int i=1;
        arr[0]=t[0];
        while(arr[i-1].indexOf("%s")>=0) {
            arr[i]=arr[i-1].replaceFirst("%s",t[g]);
            i++;
            g++;
        }
        for(int j=g;j<t.length-1;j++) {
            arr[i-1]+=t[j];
        }
        System.out.println("\""+arr[i-1]+'\"');
    }
}
}
发表于 2019-03-03 11:49:33 回复(0)
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();
    }
}

发表于 2018-12-10 10:21:10 回复(0)
菜鸟笨方法:遍历字符串,找到%s,然后进行替换更新字符串,同时更新遍历的字符长度
遍历完成后,将剩余的字符添加到字符串后,返回最终的字符串;
占用较多内存
编辑于 2018-09-08 21:50:08 回复(1)

时间复杂度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();
    }
}
编辑于 2018-05-01 11:42:02 回复(0)
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();
    }
}

发表于 2018-02-20 00:49:13 回复(0)
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));
    }

}


发表于 2017-11-02 15:44:59 回复(0)
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");
StringBuffer sb=new StringBuffer();
for(int i=0;i<arr.length;i++){
sb.append(arr[i]);
sb.append(arg[i]);
}
for(int i=arr.length;i<m;i++)
sb.append(arg[i]);
return sb.toString();
}
}
发表于 2017-04-13 18:22:48 回复(0)
public String formatString(String A, int n, char[] arg, int m) {
        String result = null;
        int count = 0,i=0;
        if(A.charAt(0) == '%'){
            result = String.valueOf(arg[count++]);
            i = 2;
        }else {
            result = String.valueOf(A.charAt(0));
            i += 1;
        }
        for(;i<n;){
            if(A.charAt(i)=='%'){
                result += arg[count++];
                i += 2;
            }else {
                result += A.charAt(i);
                i += 1;
            }
        }
        if(count<m){
            while(count!=m){
                result += arg[count++];
            }
        }
        return result;
    }
发表于 2017-03-13 13:23:47 回复(0)
//处理字符串,转成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);
    }
}

发表于 2017-03-05 12:49:54 回复(1)
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();
    }
}

发表于 2016-12-29 16:39:17 回复(0)
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;
    }
}

发表于 2016-08-31 16:27:40 回复(0)
//题目比较简单,常规做法可能就是替换操作,但是用一个字符替换两个字符,造成的代价就是
    //替换完成之后后面的字符全部要向前移动一位。
    //所以对于长度为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();
    }

发表于 2016-08-25 11:20:17 回复(0)