7-9 删除重复字符
输入样例:
ad2f3adjfeainzzzv
结尾无空行
输出样例:
23adefijnvz
结尾无空行
实验过程分析:首先我们在前面提到过,怎么删除一个数组里面的一个元素,当时的话,我想到的是把数组的数据给覆盖,就是他右面的向左边移动,覆盖了那一个多余的字符,这也就是一般的思路,首先实现的是删除字符,后把剩下的字符我们需要统计下来个数,并让他们作比较,进行排序,还是老样子,先是给数组逐个赋值,并将i的值保存下来,怎么判断有没有重复的,在这里我们就需要i+1,就要和他之前的数比比,看是不是相同的,相同的我们就去掉他,去掉他,又会产生一个问题,就是后面的元素到这个去掉的位置了,所以我们要抑制住i的++,不然就会有个数据逃脱比较的程序,所以我们必须要让i--,可是又衍生出来一个问题,就是我们又不知道是否执行删除这个数的操作,这个时候我们有需要一个变量来判断是否有重复的,于是我们就定义一个flag来统计,此时我们还需要发现有重复的就马上break,不然我们的flag的有效使用次数只有一次,但是又出现了一个问题,就是如果i不++的话,那我们怎么去实现for循环的跳出呢,我们就又定义了一个变量now,开始的他就是我们输出字符的个数,i是不能变的,那我们就让now来--,随着now的不断--,也就实现了for循环的最终跳出,因为当i到了重复字符的时候他就不动了,now此时--,就相当与变向让i++,同时i又可以产生互换的作用,每一次字符重复调换之后我们都需要把flag重新赋值为0,这样我们也就实现了相应的统计重复数据的作用。最后我们只需要比大小即可,当时我由于想了太久,连比大小都想不出来了,当时一直在寻找一个i和j的关系,j=i+1的话,当时想的循环次数应该和i和j都有关系,弄了老半天也没有出来,实际上只要和一个有关系就可以了,一个++,一个--,相当与一个+2的效果,循环次数如果只是单纯的+1-1,那么我们只需要一个变量变化就可以了。
直接上代码。
#include
int main() {
int i,now,l=0,k,o,g,flag=0;
char temp;
char a[80];
for(i=0; ((a[i]=getchar())!='\n'); i++);//这个功能就是先把字符弄进去数组里面一定不要写成a[i]=getchar()!='\n',外面的括号一定要带,因为先是执行的是getchar()!=‘\n’,如果是真的,他就是1,也就是把1给了a[i],调试的时候发现数组里面的元素竟然都是1,就很奇怪,希望屏幕前的你不会出错。😂
now =i;//统计用户输入了几个数。
for(i=0; i
for(l; l
if(a[i]==a[l]) {//基本思路就是让每一个元素和他之前的比较,如果有就让flag变化
flag=1;
break;//让flag的有效使用次数变多。
}
}
for(l; flag==1; l++) {//有重复的那么我们的删除代码就会工作。
if(a[i]==a[l]) {
o=i;
g=i;
for(g,k=0; k
a[g]=a[g+1];
}
now--;//由于i不能变,还需要跳出循环,我们就可以让判断条件里面的变量进行--操作,即实现了统计现有元素的个数,同时又实现了for循环的跳出,等到i=now就会跳出。
flag=0;//让开关重新变成断开的状态,如果还有重复的就会重新执行删除代码。
i--;//删除了指定位置的元素,下一个元素就会到这个位置,由于上面有i++,我们就需要用i--,来定住,防止有数据逃脱检查的步骤
}
}
l=0;//抵消l++的作用,方便在此循环时的让已经删除元素的那个位置和之前的元素都能比较。
}
for(i=0; i
for(l=i+1; l<=now-1; l++) {//控制列
if(a[i]>a[l]) {//把最小值不断的放到目前进行比较的数的第一个。
temp=a[i];
a[i]=a[l];
a[l]=temp;
}
}
}
for(i=0; i
}
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
