题目描述
请实现一个函数,将一个字符串中的每个空格替换成“%20”。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。
算法思想
- 遍历以便字符串,求出字符串中空格的个数,这样也就计算出了替换之后的字符串的总长度。
- 设置两个指针p1,p2,这里的指针并不是传统意义上的指针(*p之类)指向内存地址,而就是字符串数组的下标。类似的“指针”还有剑指offer-和为S的连续正数序列、和为S的两个数字。p1指向原始字符串的末尾,p2指向新的长度的字符串的末尾。
- 两个指针同时向前走,在碰到空格前,p1每走一步就将对应的字符赋值给p2。
- 碰到空格,p2向前走同时插入“%20”
- 一直这样,知道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--;
}
}
};
学习要点
- 这道题本身算法思想不难,注意之后做字符串的题要考虑“从后往前”的算法,可能比“从前往后”的算法更好。
- 牛客网模板中length是指字符数组的总容量(可以巨长),而在编程中定义的OriginalLength才是原始字符串的真实长度。
- 编程时要注意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指向同一个地址。