问题描述
- C++用数组表示集合问题
-
设A、B是两个具有10个正整数的集合,试编程求两个集合的并、交、差。
分析:
a) 根据集合的定义, A、B内不应该有重复的元素,因此,在输入集合数据时, 应该同时检查元素是否已经存在,这可以定义一个函数int find(int a[], int search)来实现,此函数在求并、交、差时同样需要调用。
b) 在实现A和B的并时,可以定义一个20个元素的数组C,先将A中所有元素存入C,然后对B中每个元素,检查是否已经包含在A中,如果不存在,则存入C中。
c) 实现A和B的交集时,可以定义一个10个元素的数组D,依次取A中的元素,如果存在于B中,则存入D。
d) 实现A-B时, 定义一个10个元素的数组E,依次取A中元素,如果不存在于B中,则存入E;同理可求B-A。求大神帮助...表示完全不会把数组元素删了...跪求代码...
解决方案
按照给的“分析”处理。再定义一个数组,去添加重复的数据,而不用涉及删除。
解决方案二:
设A、B是两个具有10个正整数的集合,试编程求两个集合的并、交、差。
其实这个问题多出现在一些企业的面试题中,建议看看程序员面试宝典,因为要考虑到时空效率问题,不是说你用笨办法能做出来就行......
解决方案三:
讲点废话:
你可以假设一个稀疏矩阵,A=行,B=列,各自排序后用(A[0],B[0])-(A[n],B[m])作为稀疏矩阵中的非0元素
如果有(A[k1],B[k2]),其中A[k1]==B[k2],那么就是重复元素(矩阵的[0,0],[1,1]...[n,n])
比如A={1,2,4} B={0,2,3}
0 1 2 3 4
0|0 1 1 0 1
1|0 0 0 0 0
2|0 1 (1) 0 1
3|0 1 1 0 1
4|0 0 0 0 0
当然这个方法比较浪费空间(m x n),离散数学书里应该提供了更好的方法
正经答题:
推荐使用map,只需要遍历数组A,++map[A[i]];再遍历数组B时,map[B[i]]==1?return "Warning,重复元素:"+B[i]+"/n":++map[B[i]];
解决方案四:
按部就班做就是了
题目意思是,每次加入一个元素,先查找,如果找到了就是重复数据,不加入数组,没找到就是非重复数据,加入数组。
题目给的思路,未必是最佳实现,但一定是可以实现的。也就是说正确性是没问题的。
仔细理解,题目的思路,这是最基本的方法
那些优化算法,都是在这种基础算法上,加以分析,设法改进,优化后的结果。
解决方案五:
集合本身是不用考虑顺序的,不过有序的集合更方便查找,所以通常非重复集合存储方式,都是有序存储的
时间: 2024-12-10 03:37:26