社区
Java SE
帖子详情
一道面试题,寻求优秀的解法:对于2个一维数组,如何查找出重复的元素
G_B
2007-11-13 06:32:19
面试时,其中有这么一道题目:
对已有的2个一维数组,譬如说A[],B[],找出2个数组重复的元素。
我的解答:
先对2个数组各自排序,然后再逐一比较。
面试的哪位仁兄说我的答案已经比较接近,但是还有更优秀的,叫我自己再多想想。面试结束后我想了一个多小时直到现在,还是没想出如何改进。
各位经过的朋友可以说说你们解决这对题目的方法吗,谢谢!
...全文
1731
61
打赏
收藏
一道面试题,寻求优秀的解法:对于2个一维数组,如何查找出重复的元素
面试时,其中有这么一道题目: 对已有的2个一维数组,譬如说A[],B[],找出2个数组重复的元素。 我的解答: 先对2个数组各自排序,然后再逐一比较。 面试的哪位仁兄说我的答案已经比较接近,但是还有更优秀的,叫我自己再多想想。面试结束后我想了一个多小时直到现在,还是没想出如何改进。 各位经过的朋友可以说说你们解决这对题目的方法吗,谢谢!
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用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)
c语言常见
面试题
收集
c语言
面试题
,不为赚分,只希望能给各位找工作的兄弟姐妹有所 帮助
收集的各公司的java笔试
面试题
收集的各公司的java相关的笔试
面试题
,java基础,javascript,html,css,各种开远框架等
c语言实用集(基础、数据结构、面试经典)
c语言实用集(基础、数据结构、面试经典),是你c语言入门和面试的必备资料
c语言相关
面试题
.zip
c语言
面试题
百度,微软等数据结构+算法经典面试100题(集锦版,含答案)
微软,百度等数据结构+算法经典面试100题。找工作必备。
Java SE
62,630
社区成员
307,261
社区内容
发帖
与我相关
我的任务
Java SE
Java 2 Standard Edition
复制链接
扫一扫
分享
社区描述
Java 2 Standard Edition
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章