输入一个长度不超过100的字符串,删除串中的重复字符。

在这里插入图片描述

#include <stdio.h>    
#include <string.h>    
#define N 200    
int main()    
{    
    char a[N];  //存储字符串.  
    int i,j,n;    
    char k;    
    gets(a);//读入字符串. 
    //控制外层循环的趟次,并提供趟次号变量i
    int f=strlen(a);  
    for(i=0;i<strlen(a);i++)  
    {
        for(n=0;n<i;n++)//内层遍历从i=1开始进入,控制各趟次内需要执行循环的次数
        {
            if(a[i]==a[n])  //n比i更加常变:每趟比较中,i只有相同的一个值,而n由i个值.;每一趟中,i就作为一个标杆
            {  //a[i] == a[n]意味着出现了重复字符;
                //下面这个循环将下一个值替代上一个值,即相当于把位置i之后的那部分子字符串向前集体地挪了一格,从而减小重复字符串的规模
                for(j=i;j<f;j++)
                {
                    a[j]=a[j+1]; //迭代a[j] ,并对字符数组(字符串)做出了该改变(j+1)可以触及到字符串结束符'\0' !
                }  
                //i=i-1;//将这轮发生处理地循环重新执行??/(迭代),最外层i++会加回到这个i,
                i -= 1;
                break;//直达外层for
            }//刚从此处离开后,n++(n将+1),之后,在这一轮发生地if将是上一轮规模地比较,不会再更改字符串了,直到外层地i++后重新开始
        
        }
     
        //刚从此处离开后,会执行在外面一层地循环变量迭代(i++)

    }  
     
    puts(a);    
    return 0;    
}

版本二:

#define _CRT_SECURE_NO_WARNINGS
/* 题目描述
输入一个长度不超过100的字符串,删除串中的重复字符。

输入要检查的字符串,长度不超过100个字符:abacaeedabcded.
输出删除重复字符后的字符串:abced.
样例输入saas
样例输出sa
 */
 //握手模型;最理想地输入的比较次数规模(1+2+..+n)地规模(类似勾股数枚举)
#include <stdio.h>
#include <string.h>
int main()
{
	//int a[100] = { 0 };
	char a[100] = { 0 };
	int i, j;
	
	gets(a);
	int len = strlen(a);



	for (i = 0; i < len; i++)
	{
		
		const char tmp = a[i];
		if (tmp != -1)
		{
			for (j = i + 1; j < len; j++)
			{
				if (tmp == a[j])
				{
					a[j] = -1;
				}
			}

		}
	}
	for (int i = 0; i < len; i++)
	{
		if (a[i] != -1)
		{
			printf("%c", a[i]);
		}
	}
	printf("\n");
}

/*失败的彩蛋*/

//for (i = 0; i < len; i++)
//{/*用最简单的输入测试:dd */
//	const char tmp = a[i];
//	for (j = i + 1; j < len; j++)
//	{
//		if (tmp == a[j])
//		{
//			for (int k = j; k < len - 1; k++)
//			{
//				a[k] = a[k + 1];/*要注意:k+1<len(或说k<=len-1)*/
//			}
//			len--;
//			j = i + 1;
//		}

//	}//for

//}//for

posted @ 2023-10-31 19:09  xuchaoxin1375  阅读(75)  评论(0)    收藏  举报  来源