【剑指offer】05替换空格,C++实现

1.题目

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

 2.思路

# 从头到尾遍历字符串做替换,时间复杂度为O(n2),效率低

# 从尾到头遍历字符串做替换,时间复杂度为O(n),效率高

 3.举例(从尾到头遍历字符串)

# 边界检查,判断字符数组是否为空

# 遍历字符串,统计空格总数count_space,统计替换前字符个数count_old,统计替换后字符个数count_new,其中count_new = count_old + 2*count_space

# 边界检查,判断字符数组是否越界

# 替换空格,用指针P1指向原始字符串的末尾,指针P2指向替换后字符串的末尾。向前移动指针P1,如果P1指向的元素不是空格,则将P1指向的元素复制给P2指向的位置;如果P1指向的元素是空格,则P2依次向前移动并插入%20。当P1==P2时,结束替换。

                                                                                                          剑指Offer(二):替换空格

4.code

# C++字符数组存储字符串,字符数组中编译器自动添加字符串的结束标识’\0’,字符串结束标识在字符数组中占一个位置,注意字符数组的越界问题。

  1 class Solution {
  2 public:
  3     // 指向字符数组的字符指针str,字符数组长度length
  4 	void replaceSpace(char *str,int length) {
  5 
  6         // 边界检查1:判断字符数组是否为空
  7 	    if(str==NULL)
  8             return ;
  9         // 遍历字符串,统计空格个数、替换前字符个数、替换后字符个数
 10         int CountOfBlanks=0; // 空格个数
 11         int Originallength=0;// 替换前字符个数
 12         int len=0;           // 替换后字符个数
 13 
 14         for(int i=0;str[i]!='\0';++i)
 15         {
 16             Originallength++;
 17             if(str[i]==' ')
 18                 ++CountOfBlanks;
 19         }
 20 
 21         len =Originallength+2*CountOfBlanks;
 22 
 23         // 边界检查2:判断字符数组是否越界
 24         if(len+1>length)
 25              return ;
 26 
 27         // 替换空格
 28         char*pStr1=str+Originallength;// 字符指针指向原始字符串的末尾
 29         char*pStr2=str+len;           // 字符指针指向替换后字符串的末尾
 30 
 31         while(pStr1 != pStr2)         // 替换结束的条件
 32         {
 33             if(*pStr1==' ')
 34             {
 35                 *pStr2--='0';
 36                 *pStr2--='2';
 37                 *pStr2--='%';
 38             }
 39             else
 40             {
 41                 *pStr2--=*pStr1;
 42             }
 43             --pStr1;
 44         }
 45 	}
 46 };

转载于:https://www.cnblogs.com/wanglei5205/p/8496057.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值