我是靠谱客的博主 虚心过客,这篇文章主要介绍c语言用制表法删除重复元素排序字符串/数组,现在分享给大家,希望可以做个参考。

删除一个数组或字符串中的重复元素并对其进行排序的问题大概大家都遇到过。
之前我的思路:
1.先将数组里所有的元素排序。
2.用将数组元素向前移覆盖掉重复元素的方法删除重复元素。

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
#include<stdio.h> #include<string.h> int num; void rank(char *str,int num) { int i,j; char temp; for(i=0;i<num-1;i++) for(j=i+1;j<num;j++) if(str[i]>str[j]) { temp=str[i]; str[i]=str[j]; str[j]=temp; } } void de(char str[],int *num) { int i,j,k; for(k=0;k<=*num;k++) { for(i=0;i<*num-1;i++) if(str[i]==str[i+1]) { for(j=i;j<*num-1;j++) str[j]=str[j+1]; (*num)--; } } } int main() { char str[100]; gets(str); int num,i,j,k; num=strlen(str); for(i=0;i<num;i++) { if(str[i]==' ') { for(j=i;j<num-1;j++) str[j]=str[j+1]; num--; } } rank(str,num); de(str,&num); for(i=0;i<num;i++) printf("%c",str[i]); return 0; }

天哪,这种方法真的要写太多了吧!

后来发现有另一种解法:制表法。(有可能在其它地方不叫这种方法)。
这种方法跟上面一种方法相比的优缺点是:
优点:代码看起来简洁了许多。
缺点:与上面的方法相比占用了更多的内存空间。
代码如下:

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include<stdio.h> int main() { char a[20],b[256]={0};//此处的b数组必须要进行初始化。一个数组申明后,如果没有赋值,那么只是分配了内存空间,没有具体的值,也可以说是空,其组成是“”也就是NULL,无法在实际中使用。 int i; gets(a); for(i=0;a[i];i++) b[a[i]]=1;//标记b数组的数组下标 for(i=0;i<256;i++) if(b[i]==1) printf("%c",i); //输出被标记的数组下标 putchar('');//加上一个字符串的结束标志 return 0; }

看,是不是简洁了很多!
这种方法大致的思路是:
1.建一个能容纳下可能会出现的所有字符的ASCII码的整数数组b。
2.标记b数组中对应a数组中数的数组下标(此处我用1进行了标记)。
(这样做的好处是标记的同时就把序排了,而且如果有重复元素也只会被标记一次,就起到了去除重复元素的效果)
3.用%c输出被标记的b数组下标。(输出的也是a中的元素)
4.加上一个字符串结束标志。
这种方法真的很巧妙!如果我找到了更好的方法再和大家分享。
如果有什么不懂的或者觉得我有哪里讲错了的,欢迎在评论区留言!
大家一起进步吧!

最后

以上就是虚心过客最近收集整理的关于c语言用制表法删除重复元素排序字符串/数组的全部内容,更多相关c语言用制表法删除重复元素排序字符串/数组内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(83)

评论列表共有 0 条评论

立即
投稿
返回
顶部