某支付公司笔试编程题

/**
 * 最后一题的编程题
 * 判断数组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;
    }
}

  结论: 我的方案没有考虑到效率,只是单纯完成了题目,对于数组小而言是没有什么问题的,但是一旦数组十分庞大时,效率就很低了,遍历一个一个比较,想想都有点可怕.......后面总监提醒了之后我回去按照他的思路实现了一下,先排除 没有交际的情况,在排除个数不相等的情况,在进行比较,比较的次数降低了,自然效率就高了。

以上个人测试,如有更好的方案,欢迎留言。

猜你喜欢

转载自www.cnblogs.com/liyong888/p/9270402.html
今日推荐