请实现一个函数,将一个字符串中的每个空格替换成“%20”。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。
#define MAX 1000
char* replaceSpace1(char* str,int len)//开辟一个数组
{
int spacenum = 0;//统计空格
char *p = str;
while (*p != '\0')
{
if (*p == ' ')
{
spacenum += 1;
}
p++;
}
char *newstr = (char *)malloc(len + 2 * spacenum + 1);
int i = 0, j = 0;
for (; i < len; i++)
{
if (str[i] != ' ')
{
newstr[j++] = str[i];
}
else
{
newstr[j++] = '%';
newstr[j++] = '2';
newstr[j++] = '0';
}
}
newstr[j] = '\0';
strcpy(str, newstr);
str[strlen(newstr) + 1] = '\0';
free(newstr);
return str;
}
char * replaceSpace2(char *str, int len)//在原数组上操作
{
int num = 0;//统计空格
char *p = str;
while (*p != '\0')
{
if (*p == ' ')
{
num += 1;
}
p++;
}
if (!num)
return str;
int i = len;
int j = i + num * 2;
str[j + 1] = '\0';
for (; i>0; i--)
{
if (str[i] != ' ')
{
str[j--] = str[i];
}
else
{
str[j--] = '0';
str[j--] = '2';
str[j--] = '%';
}
}
return str;
}
int main()
{
char arr[MAX] = "We Are Happy";
int len = strlen(arr);
cout << "1:" << replaceSpace1(arr, len) << endl;
cout << "2:" << replaceSpace2(arr, len) << endl;
return 0;
}
编码完成下面的处理函数,函数将字符串中的字符’‘移到字符串的前部分,前面的非’’
字符后移,但不能改变非’‘字符的先后顺序,函数返回串中非’'字符的数量。(要求尽可能的占用少的时间和辅助空间)。
例如:原始串为au**toc**h**i*ps,处理后为*******autochips,函数返回9.
int one(char *str)
{
int i, j = strlen(str) - 1;
for (i = j; j >= 0; --j)
{
if (str[i] != '*')//i不为* i,j直接向前
{
i--;
}
else if (str[j] != '*')//j为字母&&i为* 发生交换
{
str[i] = str[j];
str[i] = '*';
i--;
}
}
return i + 1;
}
int main()
{
char str[] = { "au**toc**h**i*ps" };
printf("%d", one(str));
return 0;
}
思路:
定义两个变量 从字符串尾部开始,开始i =j = strlen(str)-1;
当i != ‘'时i,j同时向前移动
当i == '’ && j ==’’ 时仅仅有j向前移动,因此i就停留在了从后往前的第一个的位置
当i == '’ && j != ''时 i与j的元素发生交换
三种情况 | 发生事件 |
---|---|
i ! | i-- j– |
i= && j! | 交换 i-- j– |
i= && j= | j– |
输入一个字符串,注意是可以带空格的,我们所要做的是如果字符之间有很多个连续的空格,我们只需要保留一个空格,并输出显示。
有一个类似的问题,是将一个数中连续相同的数删除掉,只保留其中一个数,如3456667,转化为34567。这个问题与字符串的问题大体上是一致的,
只是字符串限定了只有连续的空格需要处理,连续的其他字符是可以接受的,如abbbc是满足条件的,而a bbb ccc则要转换为a bbb ccc.
char *deletespace(char *str, int len)
{
int i = 0, j = 0;
char *p = str;
for (; i < len; i++)
{
if (str[i] != ' ')
{
str[j++] = str[i];
}
else if (str[i] == ' ' && str[i+1] != ' ')
{
str[j++] = str[i];
}
}
str[j] = '\0';
return str;
}
int main()
{
char arr[] = "a b c d";
int len = strlen(arr);
cout << "deletespace:" << deletespace(arr, len) << endl;;
return 0;
}