替换空格---举一反三

 

替换空格

题目描述:用函数实现一个功能,把字符串中的每个空格替换成“%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;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值