《剑指Offer》Java刷题 NO.2 替换空格

《剑指Offer》Java刷题 NO.2 替换空格(字符串、replaceAll函数)

时间:2020-02-03 题目: 请实现一个函数,将一个字符串中的每个空格替换成“%20”。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。


Java代码:

/**
 * 请实现一个函数,将一个字符串中的空格替换成“%20”。
 * 例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。
 * 注意null、空串、连续空格
 */

public class ReplaceString {
          
   
    /**
     * 最佳解答:利用自带函数
     * 运行时间:23ms
     * 占用内存:9492k
     */
    public String replaceSpace_1(StringBuffer str){
          
   
        if(str==null) return null;//先判断是否为空
        return str.toString().replaceAll(" ","%20");
    }

    /**
     *解法二思路:挨个查询字符,遇到空格就替换
     * 运行时间:22ms
     * 占用内存:9456k
     */
    public String replaceSpace_2(StringBuffer str){
          
   

        if(str==null) return null;//先判断是否为空

        for(int i=0;i<str.length();i++){
          
   
            char c=str.charAt(i);
            if(c== ){
          
   
                str.replace(i,i+1,"%20");
                //根据源码,此方法是将空格后的全部字符根据需要替换的字符串长度进行后移然后把它放进去
            }
        }
        return str.toString();
    }

    public static void main(String[] args) {
          
   
        ReplaceString rs=new ReplaceString();
        //StringBuffer sb=new StringBuffer("We are lucky.");
        StringBuffer sb=new StringBuffer("");
        String result=rs.replaceSpace_2(sb);
        System.out.println(result);
    }
}

C++:

/**
 * 请实现一个函数,将一个字符串中的空格替换成“%20”。
 * 例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。
 * 注意null、空串、连续空格
 */
#include <iostream>
#include<string>
using namespace std;
class Solution {
          
   
public:
	/**
	*思路:先计算出有多少个空格(count),然后计算移动后需要多少额外空间(此处为count*2);
	*然后从后往前移动字母并插入所给字符,这样每个空格后面的字符只需要移动一次;
	*如果是从前往后,那么遇到第一个空格,后面的所有字符需要移动一次;
	*遇到第二个空格,后面的字符还需要移动...(看图)
   *运行时间:4ms;占用内存:476k
	*/
	void replaceString(char* str, int length) {
          
   

		int i = 0;
		int count=0;//空格数量
		int realNum=0;//字符串实际长度(不包含最后的)

		while (str[i] != ) {
          
   
			realNum++;
			if (str[i] ==  )
				count++;
			i++;
		}

		int newLength = realNum + count*2;//替换以后的字符串长度(不包含最后的);
		//每个空格会对应多出两个字符
		int oldIndex = realNum;//考虑最后的,此处不用-1
		int newIndex = newLength;

		if (newLength + 1 > length)//不能超过给定长度
			return;

		while ((oldIndex >= 0) && (newIndex >= 0)) {
          
   
			if (str[oldIndex] !=  ) {
          
   
				str[newIndex--] = str[oldIndex--];
			}
			else {
          
   
				oldIndex--;
				str[newIndex--] = 0;
				str[newIndex--] = 2;
				str[newIndex--] = %;
			}
		}

	 }

};
int main()
{
          
   
	Solution so;
	char chars[] = "we are lucky";
	char* p = chars;
	so.replaceString(p, 17);
	cout << chars;
}
经验分享 程序员 微信小程序 职场和发展