<source id="wwucw"><optgroup id="wwucw"></optgroup></source>
  • <option id="wwucw"><optgroup id="wwucw"></optgroup></option>
  • 首頁 > 試題廣場 > 替換空格
    [編程題]替換空格
    請實現一個函數,將一個字符串中的每個空格替換成“%20”。例如,當字符串為We Are Happy.則經過替換之后的字符串為We%20Are%20Happy。
    推薦
    //思路
    //1:從前往
       查看全部
    編輯于 2015-12-07 18:51:44 回復(254)
    /*
    問題1:替換字符串,是在原來的字符串上做替換,還是新開辟一個字符串做替換!
    問題2:在當前字符串替換,怎么替換才更有效率(不考慮java里現有的replace方法)。
    	  從前往后替換,后面的字符要不斷往后移動,要多次移動,所以效率低下
          從后往前,先計算需要多少空間,然后從后往前移動,則每個字符只為移動一次,這樣效率更高一點。
    */
    public class Solution {
        public String replaceSpace(StringBuffer str) {
        	int spacenum = 0;//spacenum為計算空格數
    		for(int i=0;i<str.length();i++){
    			if(str.charAt(i)==' ')
    				spacenum++;
    		}
    		int indexold = str.length()-1; //indexold為為替換前的str下標
    		int newlength = str.length() + spacenum*2;//計算空格轉換成%20之后的str長度
    		int indexnew = newlength-1;//indexold為為把空格替換為%20后的str下標
    		str.setLength(newlength);//使str的長度擴大到轉換成%20之后的長度,防止下標越界
    		for(;indexold>=0 && indexold<newlength;--indexold){  
    				if(str.charAt(indexold) == ' '){  //
    				str.setCharAt(indexnew--, '0');
    				str.setCharAt(indexnew--, '2');
    				str.setCharAt(indexnew--, '%');
    				}else{
    					str.setCharAt(indexnew--, str.charAt(indexold));
    				}
    		}
    		return str.toString();
        }
    }

    發表于 2016-05-17 18:10:46 回復(59)

    思路:從前向后記錄‘ ’數目,從后向前替換‘ ’。 重點:從后向前替換的時候的技巧 例如:“we are lucky”

    0 1 2 3 4 5 6 7 8 9 10 11
    w e a r e l u c k y
    

    可以得知count=2;//空格的個數。 所以在替換的時候7~11的字母要向后移動count×2個位置,3~5字母要向后移動(count-1)×2個位置。 所以得到 :

    0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
    w e   a r e   l u c  k y 
    w e   a r a r e u c  k l u c k y
    

    在替換的時候直接在空格處寫入%20了

    0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
    w e   a r e   l u c  k y 
    w e % 2 0 a r e % 2  0 l u c k y
    
    class Solution {
    public:
        void replaceSpace(char *str,int length) {
            int count=0;
            for(int i=0;i<length;i++){
                if(str[i]==' ')
                    count++;
            }
            for(int i=length-1;i>=0;i--){
                if(str[i]!=' '){
                    str[i+2*count]=str[i];
                }
                else{
                    count--;
                    str[i+2*count]='%';
                    str[i+2*count+1]='2';
                    str[i+2*count+2]='0';
                }
            }
        }
    };
    
    發表于 2017-04-14 11:44:26 回復(53)
    用的java
    public class Solution {
        public String replaceSpace(StringBuffer str) {
            StringBuffer out=new StringBuffer();
            for (int i = 0; i < str.toString().length(); i++) {
                char b=str.charAt(i);
                if(String.valueOf(b).equals(" ")){
                    out.append("%20");
                }else{
                    out.append(b);
                }
            }
            return out.toString();  	
        }
    }
    

    發表于 2015-09-22 11:57:46 回復(6)
    public class Solution {
        public String replaceSpace(StringBuffer str) {
            String sti = str.toString();
        	char[] strChar = sti.toCharArray();
            StringBuffer stb = new StringBuffer();
            for(int i=0;i<strChar.length;i++){
                if(strChar[i]==' '){
                    stb.append("%20");
                }else{
                    stb.append(strChar[i]);
                }
            }
            return stb.toString();
        }
    }

    發表于 2015-08-25 19:53:36 回復(31)
    RX頭像 RX
    public class Solution {
        public String replaceSpace(StringBuffer str) {
        	return str.toString().replaceAll("\\s", "%20");
        }
    }

    發表于 2015-10-28 17:56:38 回復(60)
    分析:先轉為string,然后處理完成后再轉為char *。但不是以返回值的形式,還要利用好原來的空間,用strcpy實現之。處理過程循環查找,每次找到就替換,且把每次的找到的結果當成下一次的參數,避免重復從頭查找。

    class Solution {
    public:
    	void replaceSpace(char *str,int length) {
            string s(str);
            int i=0;
    		while((i=s.find(' ',i))>-1){
    			s.erase(i,1);
                s.insert(i,"%20");
                
            }
            auto ret=s.c_str();
            strcpy(str,ret);
    	}
    };

    發表于 2017-08-20 03:18:51 回復(10)
    不知道能不能用Python,反正很方便

    # -*- coding:utf-8 -*-
    class Solution:
    ? ? # s 源字符串
    ? ? def replaceSpace(self, s):
    ? ? ? ? return "%20".join(list(s.split(" ")))
    ? ? ? ??
    發表于 2018-04-03 11:24:24 回復(5)
    題目考查的肯定不是用replace函數啦~
    思路是:從左到右遍歷,從右到左替換。

    class Solution {
    public:
    void replaceSpace(char *str,int length) {
    for(int i = 0; i < length; i ++){
    ? ? ? ? ? ? if(*(str+i) == ' '){
    ? ? ? ? ? ? ? ? length += 2;
    ? ? ? ? ? ? ? ? int j = length -1;
    ? ? ? ? ? ? ? ? while(j-2 > i){
    ? ? ? ? ? ? ? ? ? ? *(str+j) = *(str+j-2);
    ? ? ? ? ? ? ? ? ? ? j--;
    ? ? ? ? ? ? ? ? }
    ? ? ? ? ? ? ? ? *(str+i) = '%';
    ? ? ? ? ? ? ? ? *(str+i+1) = '2';
    ? ? ? ? ? ? ? ? *(str+i+2) = '0';
    ? ? ? ? ? ? }
    ? ? ? ? }
    }
    };

    發表于 2015-08-31 22:13:12 回復(19)
    
     這個題目是不是有問題? 如果 char *str 申請的空間是大于 length 且足夠容納替換后的字符串就萬事大吉. 如果空間不夠,
    則必然不能原地替換, 這樣也就是需要修改指針 str 指向的地址, 在傳值傳參的情況下, 對 str 的修改根本不可能被調用者發現.
    
    發表于 2015-08-18 14:45:43 回復(25)
    Java 一行搞定啊
    public class Solution {
    ? ? public String replaceSpace(StringBuffer str) {
    ? ? ?return str.toString().replaceAll(" " , "%20");
    ? ? }
    }

    JavaScript
    function replaceSpace(str)
    {
    ? ? var resStr = str.replace(/ /g, "%20");
    ? ? return resStr;
    }
    發表于 2017-09-04 10:52:56 回復(7)
    class Solution {
    public:
    	void replaceSpace(char *str,int length) {
    		int spaceNum=0;
            
            for(int i=0;i<length;i++)
            {
                if(str[i]==' ')
                    spaceNum++;
                
            }     
            
            int newIndex=length+2*spaceNum;
            char *index=str+length;
    		while(index>=str)
            {
                if(*index==' ')
                {
                    str[newIndex--]='0';
                    str[newIndex--]='2';
                    str[newIndex--]='%';
                }
                else{
                    str[newIndex--]=*index;
                }
                index--;
            }
        }
    };

    發表于 2015-09-27 00:11:08 回復(11)
    第二遍自己做發現了更簡單的辦法喲~
    public class Solution {
        public String replaceSpace(StringBuffer str) {
            String s = str.toString();
            if(str==null)
                return s;
             char []ss=s.toCharArray();
            StringBuffer sb = new StringBuffer();
            for(int i=0;i<ss.length;i++)
                {
                if(ss[i]==' ')
                    {
                     sb.append("%20");
                }
               else 
                   sb.append(ss[i]);
            }
            return sb.toString();
        }
    }

    發表于 2017-06-23 17:08:34 回復(5)
    public class Solution {
    ? ? public String replaceSpace(StringBuffer str) {
    ? ? ????StringBuffer st = new StringBuffer();
    ? ? ? ? for(int i = 0; i < str.length() ; i++){
    ? ? ? ? ? ? char s = str.charAt(i);
    ? ? ? ? ? ? if(String.valueOf(s).equals(" ")){
    ? ? ? ? ? ? ? ? st.append("%20");
    ? ? ? ? ? ? }
    ? ? ? ? ? ? else{
    ? ? ? ? ? ? ? ? st.append(s);
    ? ? ? ? ? ? }
    ? ? ? ? }
    ? ? ? ? return st.toString();
    ? ? }
    }
    

    發表于 2018-07-07 19:54:53 回復(0)

    很簡單啊,有漏洞嗎

    # -*- coding:utf-8 -*-
    class Solution:
        # s 源字符串
        def replaceSpace(self, s):
            # write code here
            new_s = ''
            for j in s:
                if j == ' ':
                    new_s=new_s + '%20'
                else:
                    new_s=new_s + j
            return new_s
    
    發表于 2018-03-05 22:55:37 回復(6)
    public? String replaceSpace(StringBuffer str) {
    ?? ??? ?
    ?? ??? ?return str.toString().replaceAll("\\s","%20");
    }
    
    使用正則表達式替換
    

    發表于 2017-03-17 12:56:06 回復(5)
    # -*- coding:utf-8-*-
    classSolution:
    ????# s 源字符串
    ????def replaceSpace(self, s):
    ???????return?s.replace(' ','%20')
    發表于 2016-01-31 12:00:09 回復(4)
    弄個隊列先把字符串進隊,依次出隊,遇到空格連接%20字符串,繼續出隊
    發表于 2016-03-29 15:14:25 回復(4)
    package alex.suda.jzOffer;
    
    import java.util.Scanner;
    
    public class ReplaceSpace {
    
    	/**
    	 * @param args
    	 */
    	public static void main(String[] args) {
    		// TODO Auto-generated method stub
    		Scanner scanner = new Scanner(System.in);
    		while (scanner.hasNext()) {
    			String s = scanner.nextLine();
    			StringBuffer str = new StringBuffer(s);
    			System.out.println(replaceSpace(str));
    		}
    	}
    
    	public static String replaceSpace(StringBuffer str) {
    		if (str == null) {
    			return null;
    		}
    		int blankNum = 0;
    		int length = str.length();
    		int newLength = 0;
    		for (int i = 0; i < length; i++) {
    			if (str.charAt(i) == ' ') {
    				blankNum++;
    			}
    		}
    		newLength = length + 2 * blankNum;//替換后的字符串長度
    		char[] newChars = new char[newLength];//新的字符數組
    		int index = newLength - 1;
    		for(int i=length-1;i>=0;i--) {
    			if (str.charAt(i) == ' ') {
    				newChars[index--] = '0';
    				newChars[index--] = '2';
    				newChars[index--] = '%';
    			} else {
    				newChars[index--] = str.charAt(i);	
    			}
    		}
    		return new String(newChars);
    	}
    }
    


    發表于 2016-11-16 16:54:07 回復(1)
    package HuaWei;
    public class Replace {
     /**
     * 請實現一個函數,將一個字符串中的空格替換成“%20”。
     * 例如,當字符串為We Are Happy.則經過替換之后的字符串為We%20Are%20Happy。
     */
     public static void main(String[] args) {
     String s = "We Are Happy";
     re(s);
     }
     public static void ?re(String s ){
     String[] all = s.split(" ");
     StringBuffer sb = ?new StringBuffer();
     StringBuffer sb1 = new StringBuffer();
     for(int i = 0;i<all.length;i++){ 
     if(i!=all.length-1){
     sb1.append(all[i]+"%20");
     }
     else
     sb1.append(all[i]);
     }
     System.out.println(sb.append(sb1));
     }
    }

    發表于 2015-04-08 22:03:43 回復(0)
    string replaceSpace(string iniString, int length) 
    {
    	string newString;
    	for(int i=0;i<length;i++)
    	{
    		if(iniString[i]==' ')
    		   {
    		   	 //newString+=iniString[i];
    		     newString=newString+"%20"; 
    		     continue;
    		   }
    		newString+=iniString[i];
    	}
    	return newString; 
    } 

    發表于 2016-07-23 23:32:54 回復(11)
    狠狠的撸2019手机看片电影最新版