剑指offer——实现一个函数,把字符串的每个空格替换成%20。如to be or not to be,输出to%20be%20or%20not%20to%20be。
方法1:定义一个指针p指向数组,数组内元素个数为len,直观扫描数组,没有遇到空格时p++,遇见空格时将空格置为'%',利用memmove函数将数组往后移动两个字节,移动后的两个字节分别存放‘2','0',同时p+=3,每扫描一次len--,直至最后一个元素。
#include
#include
#include
#include
char *Replace(char *a,int len)
{
char *p = a;
int count = 0;
while (len--){
if (*p == ' '){
*p = '%';
p++;
memmove(p + 2, p, len);
*(p++) = '2';
*(p++) = '0';
}
else{
p++;
}
}
return a;
}
int main()
{
char a[40] = "to be or not to be";
Replace(a,strlen(a));
printf("%s\n", a);
system("pause");
return 0;
}
方法2:先遍历一次字符串,统计出字符串中空格的总数,可以计算出替换之后的字符串的总长度。每替换一个空格,长度增加2,因此替换以后字符串的长度等于原来的长度加上2乘以空格数目。我们从字符串的后面开始复制和替换。首先准备两个指针p1和p2,p1指向原始字符串的末尾,p2指向替换之后的字符串的末尾。接下来向前移动指针p1,逐个把它指向的字符复制到p2指向的位置,直到碰到p1指向字符串首。
#include
#include
#include
#include
char *Replace1(char *arr)
{
assert(arr);
char *p1 =arr;
char *p2;
int len = 0;//数组元素个数
int count = 0;//空格个数
while (*p1 != '\0'){
len++;
if (*p1 == ' '){
count++;
}
p1++;
}
p2 =p1+2 * count;
while (p1 != arr){
if (*p1 == ' '){
p1--;
*(p2--) = '0';
*(p2--) = '2';
*(p2--) = '%';
}
else{
*(p2--) = *(p1--);
}
}
return arr;
}
void Replace2(char a[], int len){
int index = 0;//下标
int count = 0;//空格个数
int end = 0;
if (a == NULL || len < 0){
return;
}
for (; index < len; index++){
if (a[index] == ' '){
count++;
}
}
//while (len--){
// if (a[index] == ' '){
// count++;
// }
// index++;
//}//index==18,len==0
end = index + 2 * count;
while ( index != 0){
if (a[index] == ' '){
index--;
a[end--] = '0';
a[end--] = '2';
a[end--] = '%';
}
else{
a[end--] = a[index--];
}
}
return;
}
int main()
{
char a[40] = "to be or not to be";
//Replace1(a);//指针解决
Replace2(a,strlen(a));//数组下标解决
printf("%s\n", a);
system("pause");
return 0;
}
Java版