<rp id="qpc6k"><optgroup id="qpc6k"><bdo id="qpc6k"></bdo></optgroup></rp>
  • <mark id="qpc6k"><noframes id="qpc6k"><b id="qpc6k"></b></noframes></mark>
    1. <input id="qpc6k"></input>
    <u id="qpc6k"></u>

      <video id="qpc6k"><input id="qpc6k"><p id="qpc6k"></p></input></video>
      <u id="qpc6k"><dl id="qpc6k"></dl></u>
      <b id="qpc6k"><kbd id="qpc6k"></kbd></b>

      首頁 > 試題廣場 > 替換空格
      [編程題]替換空格
      請實現一個函數,將一個字符串中的每個空格替換成“%20”。例如,當字符串為We Are Happy.則經過替換之后的字符串為We%20Are%20Happy。
      算法思路:
      1、遍歷一次字符串找出所有空格數,算出擴容后的字符串長度。
      2、從后往前遍歷,定義兩個索引,一個記錄原字符串復制字符的前一個位置,一個記錄擴容字符串復制后的前一個字符位置。
      public class Solution {
      ? ? public String replaceSpace(StringBuffer str) {
      ? ? ????int len=str.length();//字符串的長度
      ? ? ? ? int count = 0;//空格數目
      ? ? ? ? for(int i=0;i<len;i++){//找到所有空格數
      ? ? ? ? ? ? if(str.charAt(i)==' '){
      ? ? ? ? ? ? ? ? count++;
      ? ? ? ? ? ? }
      ? ? ? ? }
      ? ? ? ? int newlen = len + count*2;//替換后的字符串長度
      ? ? ? ? str.setLength(newlen);
      ? ? ? ? int i = len-1;//原字符串復制前最后一個字符位置
      ? ? ? ? int j = newlen-1;//復制后的字符串最后一個字符位置
      ? ? ? ? while(i!=j&&j>=0){//從后往前遍歷,直到遍歷完成
      ? ? ? ? ? ? if(str.charAt(i)!=' '){//不是空格直接復制
      ? ? ? ? ? ? ? ? str.setCharAt(j--,str.charAt(i--));
      ? ? ? ? ? ? }else{//遇到空格
      ? ? ? ? ? ? ? ? i--;//復制前的字符串索引向前移一位
      ? ? ? ? ? ? ? ? str.setCharAt(j--,'0');//復制后的字符串每復制一次移動一位
      ? ? ? ? ? ? ? ? str.setCharAt(j--,'2');
      ? ? ? ? ? ? ? ? str.setCharAt(j--,'%');
      ? ? ? ? ? ? }? ? ? ? ? ??
      ? ? ? ? }
      ? ? ? ? return str.toString();
      ? ? }
      }
      發表于 2019-08-06 12:27:17 回復(0)
      更多回答
      推薦
      //思路
      //1:從前往
         查看全部
      編輯于 2015-12-07 18:51:44 回復(260)
      /*
      問題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 回復(60)

      思路:從前向后記錄‘ ’數目,從后向前替換‘ ’。 重點:從后向前替換的時候的技巧 例如:“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 回復(55)
      用的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 回復(7)
      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)
      分析:先轉為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)
      RX頭像 RX
      public class Solution {
          public String replaceSpace(StringBuffer str) {
          	return str.toString().replaceAll("\\s", "%20");
          }
      }

      發表于 2015-10-28 17:56:38 回復(60)
      
       這個題目是不是有問題? 如果 char *str 申請的空間是大于 length 且足夠容納替換后的字符串就萬事大吉. 如果空間不夠,
      則必然不能原地替換, 這樣也就是需要修改指針 str 指向的地址, 在傳值傳參的情況下, 對 str 的修改根本不可能被調用者發現.
      
      發表于 2015-08-18 14:45:43 回復(25)
      不知道能不能用Python,反正很方便

      # -*- coding:utf-8 -*-
      class Solution:
      ? ? # s 源字符串
      ? ? def replaceSpace(self, s):
      ? ? ? ? return "%20".join(list(s.split(" ")))
      ? ? ? ??
      發表于 2018-04-03 11:24:24 回復(6)
      題目考查的肯定不是用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)
      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)

      很簡單啊,有漏洞嗎

      # -*- 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 回復(7)
      第二遍自己做發現了更簡單的辦法喲~
      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)
      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)
      微拍福利