剑指offer-替换空格

题目描述

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

算法思想

  1. 遍历以便字符串,求出字符串中空格的个数,这样也就计算出了替换之后的字符串的总长度。
  2. 设置两个指针p1,p2,这里的指针并不是传统意义上的指针(*p之类)指向内存地址,而就是字符串数组的下标。类似的“指针”还有剑指offer-和为S的连续正数序列、和为S的两个数字。p1指向原始字符串的末尾,p2指向新的长度的字符串的末尾。
  3. 两个指针同时向前走,在碰到空格前,p1每走一步就将对应的字符赋值给p2。
  4. 碰到空格,p2向前走同时插入“%20”
  5. 一直这样,知道p1、p2重合

代码:

class Solution {
public:
    //length为字符数组的总容量
	void replaceSpace(char *str,int length) {
           if(str==NULL)
           {
               return;
           }
        //判断原字符串长度和空格数目
        int OrignalLength=0;
        int NumOfBlank=0;
        int i=0;
        while(str[i]!='\0')
        {
            ++OrignalLength;
            if(str[i]==' ')
            {
                ++NumOfBlank;
                
            }
            ++i;
        }
	
    
    //新的字符串的长度 
        int NewLength=OrignalLength+NumOfBlank*2;
        int p1=OrignalLength,p2=NewLength;
        //替换字符串空格
        int j,y=2,k=87,l=92;
        for(j=0;j<NumOfBlank;j++)
        {
        while(str[p1]!=' ')
        {
            str[p2]=str[p1];
            p1--;
            p2--;
        }
         
            str[p2]='0';
            str[--p2]='2';
            str[--p2]='%';
            p1--;
            p2--;
            
        }
    }
};

学习要点

  1. 这道题本身算法思想不难,注意之后做字符串的题要考虑“从后往前”的算法,可能比“从前往后”的算法更好。
  2. 牛客网模板中length是指字符数组的总容量(可以巨长),而在编程中定义的OriginalLength才是原始字符串的真实长度。
  3. 编程时要注意p1—和—p1的区别,虽然直观看上去很简单,但在编程的时候容易出现错误导致内存溢出等等。

引申面试题:

(1)char str1[]=”hello world” (2)char str2[]=”hello world”
(3)charstr3=”hello world” (4)charstr4=”hello world”
请问str1和str2相等吗?
str3和str4相等吗?
答:
C/C++把常量字符串放到单独的一个内存区域。当几个指针赋值给相同的常量字符串时,它们实际上会指向相同的内存地址。题目中问str1=str2?、str3=str4?(1)和(2)不相等因为两个初始地址不同,(3)和(4)相等因为它们在内存中只有一个拷贝,str3和str4指向同一个地址。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值