1、一换多
将将字符串中的空格替换为%20。如:we are family --->we%20are%20family。时间复杂度O(n),空间复杂度O(1)
#include <stdio.h>
#include <string.h>
#include <assert.h>
void SwapStr(char *str)
{
assert(str != NULL);
int len = strlen(str);
int i = 0;
int j = 0;
int count = 0;//计数器,用来统计空格的个数
for(; i < len ; i++)
{
if(str[i] ==' ')
count++;
}
i = len;//将i指向原来数组的最后
j = len + 2*count;//j指向增加后的数组的最后
while (i != j)
{
if(str[i] ==' ')
{
str[j--] = '0';
str[j--] = '2';
str[j--] = '%';
i--;
}
else
{
str[j--] = str[i--];
}
}
}
int main()
{
char str[30] ="we are family!";
printf("%s ,%d\n",str,strlen(str));
SwapStr(str);
printf("%s ,%d\n",str,strlen(str));
return 0;
}
2、一对一
函数将字符串中的字符'*'移到字符串的前部分,前面的非'*'字符后移,但不能改变非'*'字符的先后顺序,函数返回串中非'*'字符的数量。
(要求尽可能的占用少的时间和辅助空间)。
如:as**df*ghj***k*l --->*******asdfghjkl
#include <stdio.h>
#include <string.h>
#include <assert.h>
int MoveStr(char *str)
{
assert(str != NULL);
int len = strlen(str);
int i,j;//指向非*和*
int count = 0;//统计
//for (i = j= len-1;i>=0;)
//{
// if(str[i] != '*')
// {
// char tmp;
// tmp = str[j];
// str[j] = str[i];
// str[i] = tmp;
// i--;
// j--;
// }
// else
// {
// i--;
// count++;
// }
//}
for (i = j =len - 1;j >=0;j--)
{
if(str[i]!='*')
{
i--;
}
else if(str[j] !='*')//将非*换到后面
{
str[i] = str[j];
str[j] = '*';
i--;
}
}
return i+1;
}
int main()
{
char str[] = "aas**fg*jk***lo";
printf("%s\n",str);
MoveStr(str);
printf("%s,%d\n",str,MoveStr(str));
return 0;
}
3、多对一
将字符串中连续的空格删除,只保留一个空格
如: I am happy! ---> I am happy!
#include <stdio.h>
#include <string.h>
#include <assert.h>
void Change(char *str)
{
assert (str != NULL);
int len = strlen(str);
int i;
int j=0;
for (i = 1;i<=len;i++)
{
if(str[i] == str[i+1]&&str[i+1]==' ')
{
while (str[i]==' ')
{
++i;
}
--i;
}
str[++j] = str[i];
}
}
int main()
{
char str[]="I am happy !";
printf("%s\n",str);
Change(str);
printf("%s\n",str);
return 0;
}