《剑指offer》——替换空格

原创 2016年05月30日 22:50:26

题目描述

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

分析:这道题如果允许开辟一个新的数组,我们只需要从头开始扫描原数组中的每个字符,
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  
第一行代表原字符串,后面两行代表两次替换操作完成整个字符串的替换,其中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类型的,那么问题就简单多了。。。。
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(); 
    }
}


版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

【剑指offer】-替换空格

题目:请实现一个函数,将一个字符串中的空格替换成“%20”。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。 解析:如果从前往后替换字符串中的空格,...

剑指offer面试题:替换空格(将字符串每个空格替换为%20)

题目:请实现一个函数,把字符串的每个空格替换成“%20”。例如:输入:“we are happy.”,则输出:“we%20are%20happy.” 这里考虑的是在原来的字符串上做替换这一种情况: ...
  • L_XRUI
  • L_XRUI
  • 2016年06月15日 21:41
  • 804

【剑指offer】-替换空格

题目:请实现一个函数,将一个字符串中的空格替换成“%20”。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。 解析:如果从前往后替换字符串中的空格,...

C++连续输入带空格的字符串

测试文件 测试1#include #include #include using namespace std;int main() { freopen("in.txt","r",std...

剑指offer——替换空格

1. 问题描述 请实现一个函数,将一个字符串中的空格替换成“%20”。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。 2. 解答思路对于这一题...

剑指offer——面试题4:替换空格

题目: 实现一个函数,把字符串中的每个空格替换成"%20”。例如输入“We are happy.”,则输出"We%20are%20happy."。 思路: 先遍历一次字符串,就能统计出字符串中空格的总...

【剑指offer】2.3.2 字符串——面试题4:替换空格

字符串是由若干字符组成的序列。 c/c++中每个字符串都以字符'\0'作为结尾,因此每个字符串中都有一个额外字符的开销。 为了节省内存,c/c++把常量字符串放到单独的一个内存区域。当几个指针赋值给相...
  • YYlxid
  • YYlxid
  • 2015年12月25日 09:41
  • 258

剑指offer——空格替换问题和相关问题

void Test1() { //请实现一个函数,把字符串中的每个空格替换成%20 //例如输入“we are happy”,输出“we%20are%20happy” char arr[20] ...

剑指offer——字符串空格替换

题目描述:请实现一个函数,将一个字符串中的空格替换成”%20”。例如,当字符串为We Are Happy,则经过替换之后的字符串为We%20Are%20Happy。思路:一组单词不是有空格嘛,所以直接...

剑指offer面试题——替换空格

题目 :请实现一个函数,将一个字符串中的空格替换成“%20”。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。在线编程链接见:替换空格。 分析...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:《剑指offer》——替换空格
举报原因:
原因补充:

(最多只允许输入30个字)