删除空格时间0(n),空间o(1)

删除空格要求时间0(n),空间o(1)。这类型题目经常出现在笔试或者面试中,故我将此类问题做一总结。

     方法一:

int findKg(char* str,int st)
{
	for( ; str[st] != '\0'; ++st)
	{
		if(str[st] == ' ')
		{
			return(st);
		}
	}
	return(-1);
}

int findCh(char* str,int st)
{
	for( ; str[st] != '\0'; ++st)
	{
		if(str[st] != ' ')
		{
			return(st);
		}
	}
	return(-1);
}

void eraseKg(char* str)
{
	int kg,ch;
	kg = ch = -1;
	while(1)
	{
		kg = findKg(str,kg + 1);
		ch = findCh(str,kg + 1);

		if(kg == -1 || ch == -1)
		{
			break;
		}

		swap(str[kg],str[ch]);
	}

	for(int i = 0; str[i] != '0'; ++i)
	{
		if(str[i] == ' ')
		{
			str[i] = '\0';
			return;
		}
	}
}

     方法二:

void eraseKg1(char* str)
{
	int i,j;
	i = -1;
    for(j = 0; str[j] != '\0'; ++j)
	{
		if(str[j] != ' ')
		{
			str[++i] = str[j];
		}
	}
	str[++i] = '\0';
}

题目变形:将连续的多余一个的空格只剩一个

方法一:利用删除空格算法,第一次遍历数组要将连续空格的第一个空格修改为’\0’,调用删除空格算法(删除空格算法中遍历字符串不能用str[j]!=’\0’判断循环结束,而是在第一次遍历中记录字符串长度),最后将空格修改回来即可。

方法二:类似删除空格算法的方法二,只是将连续空格当成一个字符处理

//有连续空格只保留一个
void erasekg2(char* str)
{
	int i,j;
	i = -1;
	for(j = 0; str[j] != '\0'; ++j)
	{
		//两个以上的空格作为一个字符处理
		while(str[j] == ' ' && str[j] == str[j + 1])
		{
            ++j;
		}
        str[++i] = str[j];
	}
	str[++i] = '\0';
}

本题目还可以将删除空格改成删除指定字符。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值