剑指Offer-替换空格

题目描述

将一个字符串中的空格替换成 “%20”。

Input:
“We Are Happy”

Output:
“We%20Are%20Happy”

C++求长度相关知识

在C/C++中常用的获取字符串长度或者字符串数组长度的函数有:sizeof(), length(), strlen(), size().其中strlen(str)和str.length()和str.size()都可以用来求字符串的长度。str.length()和str.size()是用于求string类对象的成员函数,strlen(str) 是用于求字符串数组的长度,其参数是char*。

strlen()和sizeof()的区别。

strlen(char*):函数求是字符串的实际长度,它可以用来获取动态实际字符数组的长度,是从开始到遇到第一个“\0”,如果只是定义没有赋予初始值,这个结果是不确定的,它会从数组的首地址开始一直找下去,直到遇到”\0”停止查找。

sizeof(): 求所占总空间的字节数,静态的,跟初始状态字符数组的大小有关系,大小等于初始时字符数组的大小或者等于初始时字符数组的大小+1。
在C++中,如果定义的是字符串数组的话,那么如果想获取数组的长度,只能用sizeof(数组名),而不能用strlen(str)。

解题思路

这一题我不知道是否可以直接修改char数组,使增加长度。做了两种方法都不对,因此直接看了答案。第一种是牛客网上的形式,根据其给出的函数包装形式来写成答案。比较好理解。

思路为:先记录空格数目,确定新的数组长度,再从后向前进行替换。

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
class Solution {
public:
void replaceSpace(char *str,int length) { //这里的length是指最大长度!
if(!str || length<0) return;
int i=0, oldlen=0, count=0;
while(str[i] != '\0'){ //从头到尾遍历,根据'\0'判断到达末尾,而不需要知道长度
oldlen++;
if(str[i] == ' ')
count++;
i++;
}
int newlen = oldlen + count*2;
if(newlen > length) return;
i = oldlen;
int j = newlen;
while(i >=0 && j > i){
if(str[i] == ' '){
str[j--] = '0';
str[j--] = '2';
str[j--] = '%';
}
else{
str[j--] = str[i];
}
i--;
}
}
};