/** * 最后一题的编程题 * 判断数组A(小数组) 是 数组B(大数组)的子集 数组都是有序且是整型数组 */ public class OptimizeTest { public static void main(String[] args) { // method01(); boolean b = method02(); System.out.println(b); } private static boolean method02() { int[] bigArr = {1, 2, 3, 4, 5, 6, 7, 8}; int[] smallArr = {5, 6, 7}; //技术总监优化的方案 //先排除掉 压根没有重叠的元素 //在根据个数进行排除 //最后没有排除项了,在一一比较 //能最大限度的提高效率 if(bigArr[0] > smallArr[smallArr.length - 1]){ return false; }else if(smallArr[0] > bigArr[bigArr.length - 1]){ return false; }else{ // int[] newBigArr = null; int start = 0; int end = 0; for (int i = 0;i < bigArr.length;i++){ if(bigArr[i] > smallArr[0]){ start = i - 1; break; } } for (int i = bigArr.length - 1;i > 0 ;i--){ if(bigArr[i] < smallArr[smallArr.length - 1]){ end = i + 1; break; } } System.out.println(start); System.out.println(end); int len = end - start + 1; if(len != smallArr.length){ return false; }else{ bigArr = subArr(bigArr, start, end); } for (int i = 0;i < bigArr.length;i++){ int m = 0; int k = i; for (int j = 0;j < smallArr.length;j++){ if(bigArr[k] == smallArr[j]){ m++; k++; } } if(m == smallArr.length){ return true; } } } return false; } /** * 截取数组 * @param bigArr * @param start * @param end * @return */ private static int[] subArr(int[] bigArr, int start, int end) { int[] newBigArr = new int[end - start + 1]; int i = 0; while(start <= end){ newBigArr[i++] = bigArr[start]; start ++; } return newBigArr; } private static boolean method01() { int[] bigArr = {1, 2, 3, 4, 5, 6, 7, 8}; int[] smallArr = {5, 6, 7}; //我面试时的方案 for (int i = 0;i < bigArr.length;i++){ int m = 0; int k = i; for (int j = 0;j < smallArr.length;j++){ if(bigArr[k] == smallArr[j]){ m++; k++; } } if(m == smallArr.length){ return true; } } return false; } }
结论: 我的方案没有考虑到效率,只是单纯完成了题目,对于数组小而言是没有什么问题的,但是一旦数组十分庞大时,效率就很低了,遍历一个一个比较,想想都有点可怕.......后面总监提醒了之后我回去按照他的思路实现了一下,先排除 没有交际的情况,在排除个数不相等的情况,在进行比较,比较的次数降低了,自然效率就高了。
以上个人测试,如有更好的方案,欢迎留言。