请实现一个函数,把字符串中的每个空格替换成“%20”。例如输入“We are happy.”,则输出“We%20are%20happy.”。

【剑指offer面试题4】替换空格%20和清除空格

1.替换空格%20

题目:请实现一个函数,把字符串中的每个空格替换成“%20”。例如输入“We are happy.”,则输出“We%20are%20happy.”。

1.1分析

将长度为1的空格替换为长度为3的“%20”,字符差的产度变长。如果允许我们开辟一个新的数组来存放替换空格后的字符串,那么这道题目就非常简 单。设置两个指针分别指向新旧字符串首元素,遍历原字符串,如果碰到空格就在新字符串上填入“%20”,否则就复制元字符串上的内容。但是如果面试官要求 在原先的字符串上操作,并且保证原字符串有足够长的空间来存放替换后的字符串,那么我们就得另想方法。

如果从前往后替换字符串,那么保存在空格后面的字符串肯定会被覆盖,那么我们就考虑从后往前进行替换。

  1. 首先遍历原字符串,找出字符串的长度以及其中的空格数量,
  2. 根据原字符串的长度和空格的数量我们可以求出最后新字符串的长度。
  3. 设置两个指针point1和point2分别指向原字符串和新字符串的末尾位置。
  4. 如果point1指向内容不为空格,那么将内容赋值给point2指向的位置,如果point1指向为空格,那么从point2开始赋值“02%”
  5. 直到point1==point2时表明字符串中的所有空格都已经替换完毕。

1.2代码实例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
#include<iostream>
#include<stdio.h>
using  namespace  std;
//length为字符串总容量
void  replacespace( char  string[],  int  length) {
     int  blanknumber = 0;
     int  i;
     for  (i = 0; string[i] !=  '\0' ; i++) {
         if  (string[i] ==  ' ' ) {
             blanknumber++;
         }
     }
     int  k = i + 2 * blanknumber;
     if  (k > length)
         return ;
     string[k]= '\0' ; //此行必不可少
     int  point1 = i - 1, point2 = k-1;
     for  (; point1 >= 0 && point2 > point1; point1--) {
         if  (string[point1] ==  ' ' ) {
             string[point2--] =  '0' ;
             string[point2--] =  '2' ;
             string[point2--] =  '%' ;
         else
             string[point2--] = string[point1];
     }
}
int  main() {
     char  *string= new  char [50];
     while  ( gets (string)) {
         replacespace(string, 50);
         puts (string);
     }
     return  0;
}

 2.清除空格

题目:请实现一个函数,把字符串中的每个空格清除掉。例如输入“We are happy.”,则输出“Wearehappy.”。

2.1分析

这道题目是需要清楚空格,那么清除空格后所得到的字符串要比原先的字符串要短,这是我们从头到尾进行清楚空格的话就不会覆盖到空格后面的字符,所以我们可以从头开始清除。

  1. 设定两个指针p1和p2初始状态都指向字符串首字符。
  2. 如果p2指向的元素不为空格,那么将p2指向的内容赋值给p1,然后p1和p2指向下一个元素;如果p2指向的内容为空格,那么p2指向下一个元素。
  3. 直到p2指向字符串末尾的'\0'时清除空格结束。
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    #include<iostream>
    #include<stdlib.h>
    using  namespace  std;
    void  ReplaceBlank( char  *s)
    {
         //设置两个指针指向数组首元素
         char  *p1=s;
         char  *p2=s;
         while ( '\0' !=*p1)
         {
             if ( ' ' !=*p2) //如果p2指向不为空格,则将p2指向内容复制给p1指向
                 *p1++=*p2++;
             else //如果p2指向为空格,则p2指针向前移动一格。
                 p2++;
         }
    }
    void  main()
    {
         char  test[100]= "we are happy." ;
         cout<<test<<endl; //we are happy.
         ReplaceBlank(test);
         cout<<test<<endl; //we are happy.
         system ( "pause" );
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值