• 【剑指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++字符数组存储字符串,字符数组中编译器自动添加字符串的结束标识’’,字符串结束标识在字符数组中占一个位置,注意字符数组的越界问题。

      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]!='';++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 };
  • 相关阅读:
    NTDDI_VERSION,_WIN32_WINNT,WINVER,_WIN32_IE
    SOL_SOCKET, SO_KEEPALIVE
    荣幸的一天
    值得思考的一些东西
    一个flash前后台开源框架的的站点
    30个AS3开源项目
    [算法] doj 1066 最长上升子序列
    [算法] doj 1605 Common Subsequence 公共子序列
    华为EC321CDMA PCMICA 无线网卡Ubuntu下使用
    my_judged.cc 的初稿
  • 原文地址:https://www.cnblogs.com/wanglei5205/p/8496057.html
Copyright © 2020-2023  润新知