zoukankan      html  css  js  c++  java
  • 某支付公司笔试编程题

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

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

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

  • 相关阅读:
    Mysql 创建表
    oracle数据库 ORA-01017的解决办法
    用Html创建简历
    Mysql 基本的增删改查
    Linux 基本操作
    几乎百度
    测试第二天
    java map接口,可变参数,Collections集合工具类
    java set接口
    java List接口
  • 原文地址:https://www.cnblogs.com/liyong888/p/9270402.html
Copyright © 2011-2022 走看看