一个疑问:从两个数组查找相同的元素(使用最少的循环次数)

Thinking_In_IT 2009-11-03 04:15:17
两个数组分别是:M,N。他们分别含有M个、N个元素(元素可能相同),请问如果使用最小的循环数查找到两个数组含有的相同的元素?

假设M[]{1,2,3,4,5,6,……},M[]{2,3,4,5,6,……}。

PS:使用hash表查找,是获得最小循环数的方法吗?如果是,请给出示例代码,谢谢。

...全文
3454 49 打赏 收藏 转发到动态 举报
写回复
用AI写文章
49 条回复
切换为时间正序
请发表友善的回复…
发表回复
delring 2012-09-11
  • 打赏
  • 举报
回复
46楼正解
  • 打赏
  • 举报
回复
对数组a建立hash表,然后用数组b中的元素在a中做查找。
  • 打赏
  • 举报
回复
[Quote=引用 43 楼 haojia0716 的回复:]

我开始写的那个就要求先排序

但是 难道排序不需要遍历吗

还不如直接两层循环
[/Quote]大哥人家排序的那个至少循环次数比你直接两层循环的循环次数少多了
亨利 2011-03-17
  • 打赏
  • 举报
回复
Map map=new HashMap();
Integer[] arrN={1,2,3,4,5,6,7,8,9};
Integer[] arrM={1,3,2,5,9,1};
for(int i=0;i<arrN.length;i++){
map.put(""+arrN[i], arrN[i]);
}
for(int j=0;j<arrM.length;j++){
if(map.get(""+arrM[j])!=null){
System.out.println("相同的元素有"+arrM[j]);
}
}
MRPETERHXY 2010-02-02
  • 打赏
  • 举报
回复
呵呵,去穆迪面试就考了这个问题。没答上,其实一般开发人员,谁会关注这些问题。
f0501412727 2009-11-16
  • 打赏
  • 举报
回复
将2个数组先进行合并然后放到map里去,最后用map的长度减去数组的长度得到的就是2个数组中重复元素的个数
haojia0716 2009-11-09
  • 打赏
  • 举报
回复
我开始写的那个就要求先排序

但是 难道排序不需要遍历吗

还不如直接两层循环
haojia0716 2009-11-09
  • 打赏
  • 举报
回复
还有 37楼的 我在10楼写的那种方法你不能写 我已经写过了
haojia0716 2009-11-09
  • 打赏
  • 举报
回复
[Quote=引用 37 楼 kaoh1631 的回复:]
引用 34 楼 haojia0716 的回复:
算了吧 还是两层循环实际点

Java codepublicstaticvoid main(String[] args) {int[] a= {1,2,3,4 };int[] b= {2,5,4 };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]);
                }
            }
        }
    }


无语了 这个是个人都会 对吗? 呵呵。
[/Quote]


请给出你的 遍历次数比这个少的 谢谢
sirtener 2009-11-09
  • 打赏
  • 举报
回复
用map来做,循环次数是最少的,代码如下:

package com.test.sort.limit;

import java.util.Map;
import java.util.HashMap;

public class SortData {

/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
int[] arrayA = new int[10];
int[] arrayB = new int[10];

for (int a = 0; a < 10; a++){
arrayA[a] = a+1;
arrayB[a] = a+2;
}

Map<String, Object> map = new HashMap<String, Object>();

for (int i = 0; i < 10 ; i ++){
map.put(String.valueOf(arrayA[i]), 0); //将数组一中的值放入map中
}
for (int j = 0; j < 10; j++){
boolean isIn = map.containsKey(String.valueOf(arrayB[j])); //是否第二个数组的值存在于第一个数组
if (isIn){
//存在的话则相应值的次数加1
int temp = (Integer)map.get(String.valueOf(arrayB[j]));
map.put(String.valueOf(arrayB[j]), temp+1);

}
else
//不存在则新加个值
map.put(String.valueOf(arrayB[j]), 0);
}

System.out.println(map.toString());
}

}
97095639 2009-11-09
  • 打赏
  • 举报
回复
mark
Thinking_In_IT 2009-11-09
  • 打赏
  • 举报
回复
目前为止:好像大家都也没什么新方案。
Thinking_In_IT 2009-11-07
  • 打赏
  • 举报
回复
[Quote=引用 34 楼 haojia0716 的回复:]
算了吧 还是两层循环实际点

Java codepublicstaticvoid main(String[] args) {int[] a= {1,2,3,4 };int[] b= {2,5,4 };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]);
}
}
}
}
[/Quote]

无语了 这个是个人都会 对吗? 呵呵。
cangwu_lee 2009-11-06
  • 打赏
  • 举报
回复
作業? 飛過
youjianbo_han_87 2009-11-06
  • 打赏
  • 举报
回复
[Quote=引用 29 楼 aodi307 的回复:]
二分法只适合于全是数字类型的数组,要是遇到字母型的就不能用了,其实没有什么很好的办法,查询的时间复杂度是o(m*n),基本上每比较一次都是一个数组遍历过程。比较相同就break ,能平均节省一半时间。
[/Quote]

谁说二分查找法不可以用字符型里面,字符也有对应的 Ascii码的。Arrays类下的二分查找法就可以排序字符型。
Jash_Qi 2009-11-06
  • 打赏
  • 举报
回复
13楼正解。我来晚了
haojia0716 2009-11-06
  • 打赏
  • 举报
回复
算了吧 还是两层循环实际点


public static void main(String[] args) {
int[] a = { 1, 2, 3, 4 };
int[] b = { 2, 5, 4 };

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]);
}
}
}
}
Thinking_In_IT 2009-11-06
  • 打赏
  • 举报
回复
排序的循环 当然也算在内啦
heixia2025 2009-11-06
  • 打赏
  • 举报
回复
这么多讲排序的 我想问下排序时候的循环算不算数
aodi307 2009-11-05
  • 打赏
  • 举报
回复
二分法只适合于全是数字类型的数组,要是遇到字母型的就不能用了,其实没有什么很好的办法,查询的时间复杂度是o(m*n),基本上每比较一次都是一个数组遍历过程。比较相同就break ,能平均节省一半时间。
加载更多回复(29)

67,513

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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