论坛首页 Java企业应用论坛

一道笔试题(创新工厂)

浏览 33277 次
精华帖 (1) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (2)
作者 正文
   发表时间:2010-10-26  
当然还要考虑内存了,如果内存放不下要转到硬盘存那就悲剧了
0 请登录后投票
   发表时间:2010-10-28  
package threadtest;

import java.util.ArrayList;

public class TestA {
	public static void main(String[] args) {

		int[] m = { -1, 4, 5 };
		int[] n = { -15, 1, 3, 4, 5, 7, 8, 9, 10, 15 };

		new TestA().go(m, n);
	}

	private void go(int[] m, int[] n) {

		ArrayList<Integer> result = new ArrayList<Integer>();

		// N数组遍历的起始index
		int defaultJ = 0;

		// 当M数组中有重复的值,直接跳过
		for (int i = 0; i < m.length; i++) {
			if (m[i + 1] == m[i]) {
				continue;
			}

			for (int j = defaultJ; j < n.length - defaultJ; j++) {
				if (m[i] == n[j]) {
					result.add(m[i]);
					// 当N数组中有重复的值,直接跳过
					while (n[j + 1] == n[j]) {
						j++;
					}
					defaultJ = j;
					break;
				}
			}
		}

		for (int i : result)
			System.out.println(i);

	}
}
0 请登录后投票
   发表时间:2010-10-29  
huangjiej 写道
其实楼主的应该在题目中限制只能使用像数组一类的基本结构,否则用java  的hashSet 对 n和m数据都遍历一遍就得结果啦。效率还O(n)呢(hashset内建的hash算法你不算的时间复杂度话)。
另外我对这个题目的看法是:
1。 “非递减”条件,我们可以对n,m分别先做一次遍历,剔除数组中相同的,变成递增数组。
2。可以考虑先用二分查找法对m数组的第一个和最后一个元素在n中进行查找,去掉n中大于m的最后一个元素和小于m的第一个元素  的元素。减小n的大小。
3。使用线性查找来找到相同的,思路跟chinpom 的那个差不多。

你怎么不直接调函数,复杂度还O(1)呢?
0 请登录后投票
   发表时间:2010-10-29   最后修改:2010-10-29
这是用了二分法的。
package threadtest;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.Random;

public class TestA {
	public static void main(String[] args) {
		//
		// int[] m = { -1, 4, 5 };
		// int[] n = { -15, 1, 3, 4, 5, 7, 8, 9, 10, 15 };

		int rate = 10;
		new TestA().go(initArray(rate), initArray(rate * rate + 1));
	}

	private static int[] initArray(int num) {
		int[] ret = new int[num];
		Random r = new Random();

		for (int i = 0; i < num; i++) {
			ret[i] = r.nextInt(100);
		}
		Arrays.sort(ret);

		StringBuffer output = new StringBuffer();
		output.append(num + ":[");
		for (int i = 0; i < ret.length; i++) {
			output.append(ret[i] + ",");
		}
		output.deleteCharAt(output.length() - 1).append("]");
		System.out.println(output.toString());

		return ret;
	}

	private void go(int[] m, int[] n) {

		ArrayList<Integer> result = new ArrayList<Integer>();

		// N数组遍历的起始index
		int defaultJ = 0;
		int temp = 0;

		for (int i = 0; i < m.length; i++) {
			// 当M数组中有重复的值,直接跳过
			if (i + 1 != m.length && m[i + 1] == m[i]) {
				continue;
			}

			temp = Arrays.binarySearch(n, defaultJ, n.length, m[i]);
			if (temp >= defaultJ) {
				// 当N数组中有重复的值,直接跳过
				while (temp + 1 != n.length && n[temp + 1] == n[temp]) {
					temp++;
				}
				defaultJ = temp;
				result.add(m[i]);
			}
		}

		for (int i : result)
			System.out.println(i);

	}
}

0 请登录后投票
   发表时间:2010-10-29  
Set<Integer> set=new HashSet<Integer>();
StringBuffer buffer = new StringBuffer();
for(int i:m){
	set.add(i);
}
for(int i:n){
	if (set.contains(i)) {
		buffer.append(i).append(",");
	}
}
System.out.println(buffer.substring(0, buffer.length()-1));


不过很奇怪的就是如果m长度在10万级以下的时候HashSet用m比较快
如果10万以上,HashSet用n就比较快了
原因不明,有人能指点下不?我用JDK6跑的
0 请登录后投票
   发表时间:2010-10-29  
qjtttt 写道
Set<Integer> set=new HashSet<Integer>();
StringBuffer buffer = new StringBuffer();
for(int i:m){
	set.add(i);
}
for(int i:n){
	if (set.contains(i)) {
		buffer.append(i).append(",");
	}
}
System.out.println(buffer.substring(0, buffer.length()-1));


不过很奇怪的就是如果m长度在10万级以下的时候HashSet用m比较快
如果10万以上,HashSet用n就比较快了
原因不明,有人能指点下不?我用JDK6跑的

hashset是无序的,这样就破坏了原题给定的条件了
0 请登录后投票
   发表时间:2010-10-29   最后修改:2010-10-29
另外我一直闹不明白,楼主的题目是说非降序整型数组,只是说了非降序,并没有说是有序啊,为什么那么多人认为是有序的呢?还是我理解 非降序整型数组 几个字有问题么?

1,1,3,9,3,1,1 同样是非降序 但是也可以非升序的数列,我的理解不知道对么?
0 请登录后投票
   发表时间:2010-10-29  
qjtttt 写道
另外我一直闹不明白,楼主的题目是说非降序整型数组,只是说了非降序,并没有说是有序啊,为什么那么多人认为是有序的呢?还是我理解 非降序整型数组 几个字有问题么?

1,1,3,9,3,1,1 同样是非降序 但是也可以非升序的数列,我的理解不知道对么?

9,3 这不是降序是什么?非降序就是升序或者相等。
0 请登录后投票
   发表时间:2010-10-29  
hadesmile 写道
qjtttt 写道
另外我一直闹不明白,楼主的题目是说非降序整型数组,只是说了非降序,并没有说是有序啊,为什么那么多人认为是有序的呢?还是我理解 非降序整型数组 几个字有问题么?

1,1,3,9,3,1,1 同样是非降序 但是也可以非升序的数列,我的理解不知道对么?

9,3 这不是降序是什么?非降序就是升序或者相等。

哦,明白了,谢咯
0 请登录后投票
   发表时间:2010-12-19  
public class Test1 {

/**
* @param args
*/
public static void main(String[] args) {

int[] m = { -1, 4, 5 };
int[] n = { -15, 1, 3, 4, 5, 7, 8, 9, 10, 15 };
List<Integer> list = mainMethod(conversion(m), conversion(n));
for (int i = 0; i < list.size(); i++) {
System.out.println(list.get(i));
}

}

public static List<Integer> mainMethod(List<Integer> m, List<Integer> n) {
// 定义要返回的集合
List<Integer> list = new ArrayList<Integer>();
// 由于n>m*m,并且m、n同为整数,可判断n>m
// 为了提高性能,需将m元素少的集合在外部遍历
int sign = 0;
for (int i = 0; i < m.size(); i++) {
System.out.println("外部循环");
for (int j = 0; j < n.size(); j++) {
System.out.println(" 内部循环");
sign++;
if (n.get(j) == m.get(i)) {
System.out.println(" 匹配次数");
list.add(m.get(i));
// 为了提高性能,将以匹配过的元素从数组中删除,减少下一次匹配的次数
n.remove(j);
break;
}
}
}
System.out.println("总共遍历" + sign + "次!");
return list;
}

// 提供Int数组和Integer集合的转换方法
public static List<Integer> conversion(int[] array) {
System.out.println("conversion");
List<Integer> list = new ArrayList<Integer>();
for (int i = 0; i < array.length; i++) {
list.add(array[i]);
}
return list;
}
}
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics