函数将字符串中的字符'*'移到串的前部分,前面的非'*'字符后移,但不能改变非'*'字符的先后顺序,函数返回串中字符'*'的数量。
如原始串为:ab**cd**e*12,处理后为*****abcde12,函数并返回值为5。(要求使用尽量少的时间和辅助空间)想法:有点像上篇中的删除 字符串的数字并压缩。
解法:从后到前,遇到字母(非*),就与*交换。
如原始串为:ab**cd**e*12,处理后为*****abcde12,函数并返回值为5。(要求使用尽量少的时间和辅助空间)想法:有点像上篇中的删除 字符串的数字并压缩。
解法:从后到前,遇到字母(非*),就与*交换。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void swap(char* str,int i,int j)
{
if(str[i] != str[j])
{
str[i]^=str[j];
str[j]^=str[i];
str[i]^=str[j];
}
}
int departStars(char *str)
{
//k停留在其它字母上
int len,i,k,cout=0;
if(str==NULL) return 0;
if((len=strlen(str)) < 1) return 0;
i=k=len-1;
while(i>=0)
{
if(str[i]!='*')
{
swap(str,i--,k--);
}
else
{
--i;
++cout;
}
}
return cout;
}
int main(void) {
char str[]="*ABCD*D*BSD**d**";
printf("%d %s",departStars(str),str);
return 0;
}