替换空格
题目描述:用函数实现一个功能,把字符串中的每个空格替换成“%20”。例如,输入“We are happy.”,则输出“We%20are%20happy.”。
思路:
在替换空格时,从后向前开始进行搬移,因为把一个字符替换为了3个字符,所以数组的长度会变长,替换后数组的长度=空格的数量*2+替换之前数组的长度,要注意内存覆盖。
给两个标记,tailoldlength标记原数组(替换之前的数组)的最后一个元素,tailnewlength标记新数组(替换之后的数组)的最后一个元素,在tailoldlength没有遇到空格之前,把tailoldlength标记的元素搬移到tailnewlength标记的位置,搬移之后,tailoldlength和tailnewlength都向前移动,当tailoldlength遇到空格后,tailoldlength向前移动一步,把tailnewlength标记的位置依次写入"%20",在写的过程中,每写一个字符,tailnewlength向前移动一步,循环这个过程,直到把所有空格替换完成
代码实现:
void Replace(char arr[],int size)
{
if(arr == NULL || size < 0)
{
return;
}
int i = 0;
int count = 0;
int oldlength = 0;//数组实际长度
int newlength = 0;//替换后的数组长度
while(arr[i] != '\0')
{
if(arr[i] == ' ')
{
++count;
}
++oldlength;
++i;
}
int tailoldlength = oldlength;//原数组最后一个元素
newlength = oldlength + count * 2;//新数组=原数组长度+空格*2
int tailnewlength = newlength;//新数组最后一个元素
if(newlength < oldlength) return;
while(tailnewlength >= 0 && tailnewlength > tailoldlength)
{
if(arr[tailoldlength] ==' ')
{
arr[tailnewlength--] = '0';
arr[tailnewlength--] ='2';
arr[tailnewlength--] ='%';
}
else
{
arr[tailnewlength--] = arr[tailoldlength];
}
tailoldlength--;
}
}
int main()
{
//char arr[20] = "We are one";
//char arr[20] = "We are ";
//char arr[20] = "We one";
char arr[30] = " We are one";
//char arr[20] = " ";
int size =sizeof(arr)/sizeof(arr[0]);
int i = 0;
Replace(arr,size);
for(i;i < size;i++)
{
printf("%c",arr[i]);
}
printf("\n");
return 0;
}
将字符串中的字符'*'移到串的前部分,保证非*字符的顺序位置不能变
题目描述:
函数将字符串中的字符'*'移到字符串的前部分,前面的非'*'字符后移,但不能改变非'*'字符的先后顺序,函数返回串中非'*'字符的数量。(要求尽可能的占用少的时间和辅助空间)。
例如:原始串为au**toc**h**i*ps,处理后为*******autochips,函数返回9.
代码时间较容易,大致思路:
代码:
int Change(char *str)
{
int len = strlen(str);
int i = len - 1;//
int j = len - 1;//指向第一个*
int count = 0;
while(i >= 0)
{
if(str[i] == '*')
{
i--;
}
else
{
swap(str[i],str[j]);
i--;
j--;
count++;
}
}
return count;
}
int main()
{
//char str[] = "dn*nk*nl*ik";
char str[] = "au**toc**h**i*ps";
//char str[] = "******";
//char str[] = "joifjsdjff*nlv";
int n = Change(str);
printf("%d %5s",n,str);
}
结果:
将字符串中连续的空格删除,只保留一个空格"a b c d"->"a b c d"
思路:遍历a不是空格就输出往后走,是空格的打印一个空格,然后继续走到不是空格为止,中间不在打印
代码:
int main()
{
int i;
char a[100] = "a b c d";
for(i=0;a[i]!='\0';)
{
if(a[i]==' ')
{
printf(" ");//如果是空格输出一个空格,并向后遍历直到不是空格为止,中间不输出
while(a[i]==' ')
{
i++;
}
}
else//如果字符不是空格直接输出并向后遍历
{
printf("%c",a[i]);
i++;
}
}
printf("\n");
return 0;
}