字符串消除

字符串消除

心理信管计算概论 练习6 D

描述

在一个字符串中,从左到右遍历把连续的相同字符全部删除, 然后将剩下的字符组成新的字符串,继续遍历删除相邻的相同字符,直到没有可以删除的字符为止。

例如:字符串asssaasddsc

第一遍删除三个s,两个a,两个d,得到字符串**‘assc’**。

第二遍删除两个**‘s’,得到字符串’ac’**。

删除结束,输出字符串‘ac’

输入

输入一行,代表要进行消除的字符串,字符串长度不超过1000

输出

输出一行,代表消除后的字符串,如果字符串全部都被消除,输出“null”

样例输入1

asssaasddsc

样例输出1

ac

样例输入2

hhhhhhhhjkkkkkkkkkkklllj

样例输出2

null

代码

#include <stdio.h>
#include <string.h>
#include <math.h>

char a[1001];
int n;
int dele()//人生删除事务所!!
{
	int s = 0;
	int k = 0;
	char tmp[1001];
	for (int i = 0; i < n-1; i++)
	{
		if (a[i] == a[i + 1])//如果没有把中间的0跳过是不能直接让a[i]和a[i+1]比较的
		{
			for (int j = 0; j < n - i; j++)
			{
				if (a[i + j] != a[i])
				{
					for (int l = i; l < i + j; l++)
					{
						a[l] = '0';
					}
					i = i + j-1;//注意这里是需要减1的,因为进行下一个循环的时候i++还会再加上一个1,如果不减a[i+j]就被跳过了
					break;
				}
				if (i + j == n - 1)//对于'……aaa'字符串,就不能用上面的方法删除,因为没有下一个不一样的a[i+j]了
				{
					for (int l = i; l <= i + j; l++)
					{
						a[l] = '0';
					}
				}
			}
			s = 1;
		}
	}
	for (int i = 0; i < n; i++)
	{
		if (a[i] != '0')
		{
			tmp[k] = a[i];//把中间的0直接跳过
			k++;
		}
	}
	tmp[k] = '\0';//结尾需要补\0才能copy
	strcpy(a, tmp);
	return s;
}
int main()
{

	scanf("%s", a);
	n = strlen(a);
	int s=1;
	while (dele())//应该是先运行了dele之后再判断,但是如果dele返回值为0(即删到最后一步了),就不会再计算a的长度了,所以需要补一句
	{
		n = strlen(a);
	}
	n = strlen(a);
	if (n == 0)
	{
		printf("null");
		return 0;
	}
	printf("%s", a);
	return 0;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值