一道面试题,寻求优秀的解法:对于2个一维数组,如何查找出重复的元素

G_B 2007-11-13 06:32:19
面试时,其中有这么一道题目:
对已有的2个一维数组,譬如说A[],B[],找出2个数组重复的元素。

我的解答:
先对2个数组各自排序,然后再逐一比较。

面试的哪位仁兄说我的答案已经比较接近,但是还有更优秀的,叫我自己再多想想。面试结束后我想了一个多小时直到现在,还是没想出如何改进。

各位经过的朋友可以说说你们解决这对题目的方法吗,谢谢!
...全文
1731 61 打赏 收藏 转发到动态 举报
写回复
用AI写文章
61 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhangxixrh 2011-09-19
  • 打赏
  • 举报
回复
46楼的 如果数组2出现重复,则结果出问题
Clesome_VC 2007-12-05
  • 打赏
  • 举报
回复
学习学习
valibo 2007-11-30
  • 打赏
  • 举报
回复
给出两个数组 A[],B[],

如果楼主的意思是:找出 A和B都有的数据的话(前提A和B 自身中没有重复的数据)
我有一个思路大家可以讨论一下:

1)把数组A转化成 字符串形式 a

2)然后 循环 B 用B[i]在 字符串 a 里找,如果找到的话 那就是A和B都有的数据了


如果 A和B 自身都有重复的数据 那就先 把自身转换为字符串 然后做查找。。。。。。(出现2次以上就为重复项)

valibo 2007-11-30
  • 打赏
  • 举报
回复
找出2个数组重复的元素

数据里存放 字符串怎么办
你们都不考虑进去。。。。。
G_B 2007-11-20
  • 打赏
  • 举报
回复
最近有事情,所以结贴晚了点,不过也有机会看见了更多精彩的讨论。
仔细看了所有帖子,归纳了下,并带上自己的想法,请各位指正,谢谢所有关注并热心解答的朋友。

以上方法中主要分了2大类:
(1)先排序,再比较;
(2)直接比较。
很多人都想到的就是哈希进行优化,具体的各位可以参见上面的帖子。

附(个人观点):
1.13楼的受许多人推崇,但是正如41楼所说,存在漏洞,所以稍微改进下用hashSet,利用Set本身自带的不保存重复元素性质可以弥补不足,那就更完美了。通过外嵌50000次循环,2者的执行时间几乎没差别。(代码参见31楼)
2.直接采用2次循环,在同样外嵌50000次循环的情况下,执行时间远远多于采用hash后进行的查找。
3.网络凝聚力量,还有许多值得借鉴的方法,列举下:6楼提出了采用堆的结构解决 , 19楼采用了多线程 , 25楼采用了红黑树 , 31楼“先排序,然后用2个指针顺序找。实际项目中我就是这么做的。” , 38楼采用从集合中删除,或者取集合交集 , 16楼在排序后采用了二分查找(当时我也正在考虑排序后采用二分什么的来提高,但是却忘记采用常用的hash了,真是失败。最开始考虑这道题的时候准备使用set的性能,但是却一下没想出如何查找重复元素,时间有限,结果就采用提问贴中最笨的方法了,hoho)
实际当中采用什么方法比较好,我想这与个人对知识的熟悉度与具体的条件了。
再次感谢所有的朋友。
如果路过的朋友还有什么新的点子或者方法,希望能费时贴一帖^_^
xuweiquan 2007-11-20
  • 打赏
  • 举报
回复
看了你们的程序,张了见识!
intotheland 2007-11-17
  • 打赏
  • 举报
回复
晕倒,字符串比较难道比整数比较快?
for(int i=0;i<A.length;i++){
for(int j=0;j<B.length;j++){
if(A[i]==B[j]){
System.out.println("发现重复元素:"+A[i]);
System.out.println("A索引:"+i+" B索引:"+j);
}
}
}
zzxcr 2007-11-17
  • 打赏
  • 举报
回复
换种思路吧
import java.util.*;
public class compare
{
public static void main(String[]args)
{
int a[] = {1, 6, 2, 8, 5, 8, 6, 9, 0};
int b[] = {4, 5, 4, 8, 7, 6, 2, 0};

new compare().getResult1(a, b);


}
//字符串查找,推给sun来做
public void getResult1(int[]array1 ,int[] array2){
String ar1Str ="";
String elem="";
for(int ind1=0;ind1<array1.length;ind1++){
elem= new Integer(array1[ind1]).toString();
//不相同的值加入;
if(ar1Str.indexOf(elem)==-1)
ar1Str+=elem+",";

}
for(int ind2=0;ind2<array2.length;ind2++)
{
elem = new Integer(array2[ind2]).toString();
if(ar1Str.indexOf(elem)!=-1){
System.out.println("相同元素"+elem);
}
}
}

}
hellsing0105 2007-11-17
  • 打赏
  • 举报
回复
13楼的 张了见识
intotheland 2007-11-17
  • 打赏
  • 举报
回复
如果让写出Java代码我觉得
直接双循环比较可能是最快的算法了.
难道Hashset,Hashmap内部不用比较吗?
而且还涉及对象类型转换,方法调用,这些都需要额外时间开销.

假设一次整数的比较所用时间为1,数组A,数组B
那么:
双循环比较 A.length*B.length
排序后比较 A.length*(A.length-1)/2为A的最多排序时间,B.length*(B.length-1)/2为B的最多排序时间
总时间:A.length*B.length+A.length*(A.length-1)/2+B.length*(B.length-1)/2
放入Hashmap(Hashset):
put(add)方法调用时间*A.lenght+对象包装时间*A.length+get(set)方法调用时间*A.lenght+查找(比较)是否有相同对象时间*A.length+对象解包时间*A.length+get(set)方法返回结果比较时间*A.length

最后我觉得还是双循环比较时间最短,也是最优秀的方法

另类清晨 2007-11-17
  • 打赏
  • 举报
回复
十三楼太强了,可以结贴了.
j67884159 2007-11-17
  • 打赏
  • 举报
回复
防入同一个数组。排序。用冒泡判断相临的两个数。相等就输出结果;
lengyuqing523 2007-11-16
  • 打赏
  • 举报
回复
LZ 的问题 有点迷糊

如果说 A数组里有重复的元素(而这个重复的元素 B 数组里没有) 也需要打印出来吗

楼上几位高人只是解决了 A B重复的问题 没有解决 自身重复的问题
ymuddje 2007-11-16
  • 打赏
  • 举报
回复
46楼强悍,我就喜欢用现成的高级语法!
kulin3422 2007-11-16
  • 打赏
  • 举报
回复
13楼正解
karlpan01 2007-11-15
  • 打赏
  • 举报
回复
不知道谁的好,呵呵!
yutong1984 2007-11-15
  • 打赏
  • 举报
回复
13楼的想法比较巧 我觉得比较好
shili150 2007-11-15
  • 打赏
  • 举报
回复
jf
lu6590236 2007-11-15
  • 打赏
  • 举报
回复
顶13楼的
向你学习
sdd330 2007-11-15
  • 打赏
  • 举报
回复
不需要排序,放到同一个容器里面,遇到冲突就打印出来。
加载更多回复(41)

62,630

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧