某支付公司笔试编程题

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
/**
 * 最后一题的编程题
 * 判断数组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;
    }
}

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

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

posted @   李勇888  阅读(169)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 25岁的心里话
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!
· 零经验选手,Compose 一天开发一款小游戏!
点击右上角即可分享
微信分享提示