int[] A = { 1, 3, 5, 7, 9, 24, 88, 108, 126, 139 };
int[] B = { 2, 5, 24, 88, 108, 110, 112, 126 };
//得出A B 数组的重复值,不用.net库提供的方法,也不使用嵌套for循环的方式
应该怎么做? 想不到好的办法.
请各位尽量以代码示例,不胜感激
保存A、B的当前元素的索引值indexA和indexB,都初始化为0
比较A、B的当前元素
如果相等,则是重复的,indexA和indexB都加1
如果A[indexA]<B[indexB],那么indexA加1
如果A[indexA]>B[indexB],那么indexB加1
最后A或B的索引值超出范围时结束
按照上面的流程,只需要遍历一次
正解
这个解法最优
有啥 规律不,只好 for嵌套吧
C# linq的话直接取交集。var query=A.Intersect(B);
分别创建A,B的记录集,然后使用记录集的Filter功能,这样比2层循环快。
当然数据量不大的话,二者差不多。
循环长度小的数组.对大的数组做折半查找,由于短数组也是排好续的,所以每次查找到后都要把当前位置保存下来
截断长数组.
这是最快的了
如果是整数数组的话,不就可以直接比大小,第一个相同的,和最后一个相同的,记下其在A数组中的序号,就可以直接提取了
说整数数组,只是举个例子,你可以根据你数组的特征,做些这样的尝试
不连续的话,好像行不通
算法问题还是算法来解决吧!
我用js实现一个,
<script type="text/javascript"> var A=[1,3,9,11,15,18,18,21]; var B=[2,3,8,10,11,18,18,23]; var result=[]; var a=A.pop(); var b=B.pop(); do { if(b>a) { b=B.pop(); }else if(b<a) { a=A.pop(); }else { result.push(a); a=A.pop(); b=B.pop(); } }while(a!=undefined&&b!=undefined); </script>
输出结果:result:[18, 18, 11, 3]
原理:两个一排序列的数组,重复的值一定是 归并时相等的值
和楼上的方法原理差不多 谢谢
用distinct 这样符合要求么?
哥,一般人我不骂他,骂你是对你好。
-------------你写个算法要死人啊,自己不写算法能提高吗?
?
var value=(from v in A select v).Distinct().ToList(); 有提供的方法为什么不用呢?
其实这是一道面试题
其实就是归并排序的子问题。