删除字串中指定的字符

今天看到同学在做题,要求是:把一个字符串中的所有空格去掉,合并所有字符。例如

输入:abc 123 abc<enter>

输出:abc123abc


很简单吧!!


总结了一下,想到三种简单的处理方法:

第一种:时间复杂度为n^2,空间复杂度为n

void delete_3(char* str)
{
	int i=0,j=0;

	while (str[i])
	{
		if (str[i] == ' ')
		{
			j = i;
			while (str[j])
			{
				str[j] = str[j+1];
				j++;
			}
		}
		i++;
	}
}

第二种:时间复杂度为n,空间复杂度为2n

void delete_2(char *str)
{
	char s[100];
	int i = 0,j = 0;

	while(str[i])
	{
		if (str[i] != ' ')
			s[j++] = str[i];
		i++;
	}
	s[j] = '\0';
	i = 0;

	while(s[i])
	{
		str[i] = s[i];
		i++;
	}
	str[i] = '\0';

}

第三种:时间和空间复杂度都是n

void delete_1(char *str)
{
	char *p = str;
	int i = 0;
	while(*p)
	{
		if (*p != ' ')
			str[i++] = *p;
		p++;
	}
	str[i] = '\0';
}

当然,最好用就是第三种,简单而且高效!当时一看到这题,我脑子里只有第一种方法。。。。。。。可能因为我单片机玩多了,总是觉得资源是很有限的,所以利用空间换时间的处理方法很少被我想到。。。。。。但第二种方法的确要快于第一种。而第三种方法我却没有想到。。。。。感觉自己好low,真得多看看,多想想才行!!!


第三种方法看起来很简单,但却是很精妙!!这为处理字符串内字符的移位,删除等提供了一个很好的想法。

比如说,删除数组中的指定元素,而这个元素可以有多个,也可能是连续的。


小东西,却很实用!


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值