1.一个换一个
例:
函数将字符串中的字符 ’ * ’ 到 字符串的前部分,前面的非 ’ * ’ 字符后移,但不能改变非 ’ * ’ 字符的先后顺序,函数返回串中非 ’ * ’ 字符的数量。(要求尽可能的占用少的时间和辅助空间)。
如:原始串为au** toc ** h**i* ps,处理后为*******autochips,函数返回9.
//将字符串中的*移到最前面,其它字符相对顺序不变
#include<stdio.h>
void Move(char *str)//O(n),O(1)
{
int i = strlen(str);
int j = i;
for(;i>=0;i--)
{
if(str[i] != '*')
{
str[j] = str[i];
j--;
}
}
while( j >= 0)
{
str[j--] = '*';
}
}
2.一个换多个(插入)
将空格替换成%20,见<剑指offer>例题4
//将空格替换成"%20"
void Blank(char *str)//O(n),O(1)
{
int count = 0; //统计空格的数量
int i;
int j;
for(i=0;str[i]!='\0';i++)
{
if(str[i] == ' ')
{
count++;
}
}
j = i+count*2;//
for(;i>=0;i--)
{
if(str[i] != ' ')
{
str[j] = str[i];
j--;
}
else //是空格,需要替换为%20
{
str[j--] = '0';
str[j--] = '2';
str[j--] = '%';
}
}
}
3.多个换一个(删除)
将字符串中连续的空格删除,只保留一个空格(此处#代表空格)
“#a#b##c####d”->“a#b#c#d”
//删除多余空格,连续空格只保留一个
void DelBlank(char *str)//O(n),O(1)
{
int i = 0;
int j = 0;
for(;str[i]!='\0';i++)
{
if(str[i]==' '&& str[i+1]==' ')//连续空格
{
;
}
else // 不是连续空格
{
str[j] = str[i];
j++;
}
}
str[j] = '\0';
}