《剑指》-替换空格-day02


   02.请实现一个函数,将一个字符串中的空格替换成"%20"。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。

 

解题思路:


   我们可以先遍历一次字符串,这样就能统计出字符串中空格的总数,并可以由此计算出替换之后的字符串长度。每替换一个空格,长度增加2,因此替换之后字符串的长度等于原来的长度加2乘以空格数目。我们还是以“We are Happy”为例,“We are Happy”这个字符串有12个字符(C/C++应该13个字符,包括结尾符号'\0'),里面有两个空格,因此替换之后字符串长度应该是16。

   我们从字符串后面开始复制和替换。首先准备两个指针,P1和P2。P1指向原始字符串的末尾。而P2指向替换之后的字符串末尾。接下来我们向前移动P1,逐个把他指向的字符复制到P2指向的位置,直到碰到第一个空格为止。此时字符串包含(如下图)灰色背景的区域是做了字符拷贝的区域。碰到第一个空格之后,把P1向前移动1格,在P2之前插入字符串"%20"。由"%20"的长度为3,同时也要把P2向前移动3格如下图(c)所示。

   我们接着向前复制,直到碰到第二个空格(如下图(d)所示)。和上一次一样,我们在再把P1向前移动1格,并把P2向前移动3格插入"%20"(如下图(e)所示)。此时P1和P2指向同一位置,表明所有空格都已经替换完毕。


如图所示:


《剑指》-替换空格-day02_第1张图片


java代码:


public class Space {
	/**
	 * 请实现一个函数,将一个字符串中的空格替换成“%20”。 
	 * 例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。
	 */

	public static String replaceSpace(StringBuilder str) {
		int spaceNum = 0; // 空格的数量
		for (int i = 0; i < str.length(); i++) {
			if (str.charAt(i) == ' ') {
				spaceNum++;
			}
		}
		int oldlength = str.length(); // 原字符串长度 
		int newlength = oldlength + spaceNum * 2; // 新字符串长度
		str.setLength(newlength);
		int oldindex = oldlength - 1;  // 原长度下标
		int newindex = newlength - 1;  // 新长度下标
		for (; oldindex >= 0; oldindex--) {
			if (str.charAt(oldindex) == ' ') {  
				str.setCharAt(newindex--, '0');
				str.setCharAt(newindex--, '2');
				str.setCharAt(newindex--, '%');
			} else {
				str.setCharAt(newindex--, str.charAt(oldindex));
			}
		}
		return str.toString();
	}
	public static void main(String[] args) {
		String str="We Are Happy";
		StringBuilder sb = new StringBuilder(str);
		String printstr=replaceSpace(sb);
		System.out.println(printstr);
	}
}

  ——《剑指offer》笔记,仅供自己日后复习查看


你可能感兴趣的:(算法,剑指)