题目描述
请实现一个函数,将一个字符串中的空格替换成“%20”。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。
分析:这道题如果允许开辟一个新的数组,我们只需要从头开始扫描原数组中的每个字符,
1)若字符非空格则复制字符到新数组中,
2)若字符为空格则在新数组中填充“%”,“2”,”0”三个字符,
3)继续扫描重复以上操作。
难点在于如果不允许开辟新的数组空间,替换发生在原数组上,我们要做的是将1个字符替换为3个字符,且替换位置后面的字符不能被覆盖。下面我们以题目中的例子看一下字符串在内存中的存储,每个格子存储一个字符
第一行代表原字符串,后面两行代表两次替换操作完成整个字符串的替换,其中2在1的基础上以红色字体为基准后面的字符都向后移动2位,3在2的基础上以红色字体为基准后面的字符又都向后移动2位,而相对于1移动了4位。
初级想法:1)从头开始扫描数组,遇到空格,先将空格后面的字符做依次向后移动2位操作,然后填充"%","2","0",三个字符,记下填充后的下一个位置,
2)从这个位置接着扫描字符串,遇到空格做和上面同样的操作;
3)直到所有空格都被替换。
想法进阶:这样一次一次的移动是不是太麻烦了呢,如果我们知道每个字符需要移动的位数,那么是不是每个字符通过一次移动就可以到达它在目标字符串的位置呢,时间复杂度也大大降低了呢。
算法思路:从字符串的后面开始复制和替换,首先准备两个指针,p1和p2,p1指向原始字符串的末尾,p2指向替换后字符串的末尾,接下来,向前移动指针p1,逐个把它指向的字符复制到p2,碰到一个空格之后,把p1向前移动1格,在p2处插入字符串“20%”,由于“20%”长度为3,同时也要把p2向前移动3格。直到p1=p2,表明所有空格都已经替换完毕。
在牛客的《剑指》中java实现要求传入的参数是StringBuffer类型的,那么问题就简单多了。。。。
分析:这道题如果允许开辟一个新的数组,我们只需要从头开始扫描原数组中的每个字符,
1)若字符非空格则复制字符到新数组中,
2)若字符为空格则在新数组中填充“%”,“2”,”0”三个字符,
3)继续扫描重复以上操作。
难点在于如果不允许开辟新的数组空间,替换发生在原数组上,我们要做的是将1个字符替换为3个字符,且替换位置后面的字符不能被覆盖。下面我们以题目中的例子看一下字符串在内存中的存储,每个格子存储一个字符
1 | W | e | a | r | e | h | a | p | p | y | . | \0 | |||||||
2 | W | e | % | 2 | 0 | a |
r | e | h | a | p | p | y | . | \0 | ||||
3 | W | e | % | 2 | 0 | a | r | t | % | 2 | 0 | h | a | p | p | y | . | \0 |
初级想法:1)从头开始扫描数组,遇到空格,先将空格后面的字符做依次向后移动2位操作,然后填充"%","2","0",三个字符,记下填充后的下一个位置,
2)从这个位置接着扫描字符串,遇到空格做和上面同样的操作;
3)直到所有空格都被替换。
想法进阶:这样一次一次的移动是不是太麻烦了呢,如果我们知道每个字符需要移动的位数,那么是不是每个字符通过一次移动就可以到达它在目标字符串的位置呢,时间复杂度也大大降低了呢。
算法思路:从字符串的后面开始复制和替换,首先准备两个指针,p1和p2,p1指向原始字符串的末尾,p2指向替换后字符串的末尾,接下来,向前移动指针p1,逐个把它指向的字符复制到p2,碰到一个空格之后,把p1向前移动1格,在p2处插入字符串“20%”,由于“20%”长度为3,同时也要把p2向前移动3格。直到p1=p2,表明所有空格都已经替换完毕。
在牛客的《剑指》中java实现要求传入的参数是StringBuffer类型的,那么问题就简单多了。。。。
public class Solution { public String replaceSpace(StringBuffer str) { for(int i=0; i<str.length(); i++) { char temp = str.charAt(k); if(temp == ' ') { str.replace(k, k+1, "%20"); } } return str.toString(); } }
来源:https://www.cnblogs.com/iter1991/p/5664725.html