阿里2018秋招模拟笔试Java研发岗试题

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/boom_man/article/details/77466673

如何在MarkDown中添加公式

引用块内容![公式名]`(http://latex.codecogs.com/png.latex?这里输入您的公式)

选择题

1.一个抽奖游戏,有7个连续整数的球(比如1,2,3,4,5,6,7),连续随机抽取3个,如果连续抽取的两个球是连续的,则中奖,问中奖几率多大?

结果 11/21

数学方法
因为连续抽取三个数,如果连续抽取的两个是连续的则中奖分为两种情况
思路先组合在排列
①三个数直接连续 如123 本身又有6种变化 ,又因连续有5种 5*6=30种

排列组合
②有且只有两个数是连续 如 12 4 本身有4种变化 所以为 20*4=80种

因为取三个数所以边上两个是特殊的所以为
排列组合=80
共计110种

总结:如果连续抽取三个那么边上两个就是特殊情况需要区别对待,如果抽取4个那么边上三个要区别对待,在判断连续情况要分情况讨论,如果连续两个,但是抽取三个会出现连续三个和连续两个的情况。那么抽取N个呢,连续M个呢,那么有 M到N共 (N-M)种情况需要区别对待。

规律及推导

假设题变化成共有X个连续的小球,连续抽取N个小球,如果连续抽取的2个小球是连续的,则中奖,问:中奖概率是多少(其中X>=N)

排列总数为排列组合

符合条件的:
需要计算 两个小球连续,….到N个小球连续的情况和
边上特殊 其余普通对待,在特殊对待连续的

程序写下遍历方法和结果

    public void printArray(int[] array) {
        //因为不知道有几个
        //先遍历数组
        int time = 0;
        for (int i = 0; i < array.length; i++) {
            for (int j = 0; j < array.length; j++) {
                for (int k = 0; k < array.length; k++) {
                    if (array[i] != array[k] && array[j] != array[k] && array[i] != array[j]) {
                        System.out.println(array[i] + "," + array[j] + "," + array[k]);
                        time++;
                    }
                }
            }
        }
        //time为计算有多少种
        int[][] rank = new int[time][3];
        time = 0;
        for (int i = 0; i < array.length; i++) {
            for (int j = 0; j < array.length; j++) {
                for (int k = 0; k < array.length; k++) {
                    if (array[i] != array[k] && array[j] != array[k] && array[i] != array[j]) {
                        rank[time][0] = array[i];
                        rank[time][1] = array[j];
                        rank[time][2] = array[k];
                        time++;
                    }
                }
            }
        }
        System.out.println("共计" + time + "种情况");
        //上面为二次遍历赋值


        System.out.println("现在输出符合连续的情况");
        time=0;
        for (int i = 0; i < array.length; i++) {
            for (int j = 0; j < array.length; j++) {
                for (int k = 0; k < array.length; k++) {
                    if (array[i] != array[k] && array[j] != array[k] && array[i] != array[j]) {
                        if(Math.abs(array[i]-array[j])==1||Math.abs(array[j]-array[k])==1){
                            System.out.println(array[i] + "," + array[j] + "," + array[k]);
                            time++;
                        }

                    }
                }
            }
        }
        System.out.println("共计" + time + "种情况");
        //下面是判断
    }

    @Test
    public void Test() {
        int[] array = {1, 2, 3, 4, 5, 6, 7};
        printArray(array);
    }

1,2,3
1,2,4
1,2,5
1,2,6
1,2,7
1,3,2
1,3,4
1,3,5
1,3,6
1,3,7
1,4,2
1,4,3
1,4,5
1,4,6
1,4,7
1,5,2
1,5,3
1,5,4
1,5,6
1,5,7
1,6,2
1,6,3
1,6,4
1,6,5
1,6,7
1,7,2
1,7,3
1,7,4
1,7,5
1,7,6
2,1,3
2,1,4
2,1,5
2,1,6
2,1,7
2,3,1
2,3,4
2,3,5
2,3,6
2,3,7
2,4,1
2,4,3
2,4,5
2,4,6
2,4,7
2,5,1
2,5,3
2,5,4
2,5,6
2,5,7
2,6,1
2,6,3
2,6,4
2,6,5
2,6,7
2,7,1
2,7,3
2,7,4
2,7,5
2,7,6
3,1,2
3,1,4
3,1,5
3,1,6
3,1,7
3,2,1
3,2,4
3,2,5
3,2,6
3,2,7
3,4,1
3,4,2
3,4,5
3,4,6
3,4,7
3,5,1
3,5,2
3,5,4
3,5,6
3,5,7
3,6,1
3,6,2
3,6,4
3,6,5
3,6,7
3,7,1
3,7,2
3,7,4
3,7,5
3,7,6
4,1,2
4,1,3
4,1,5
4,1,6
4,1,7
4,2,1
4,2,3
4,2,5
4,2,6
4,2,7
4,3,1
4,3,2
4,3,5
4,3,6
4,3,7
4,5,1
4,5,2
4,5,3
4,5,6
4,5,7
4,6,1
4,6,2
4,6,3
4,6,5
4,6,7
4,7,1
4,7,2
4,7,3
4,7,5
4,7,6
5,1,2
5,1,3
5,1,4
5,1,6
5,1,7
5,2,1
5,2,3
5,2,4
5,2,6
5,2,7
5,3,1
5,3,2
5,3,4
5,3,6
5,3,7
5,4,1
5,4,2
5,4,3
5,4,6
5,4,7
5,6,1
5,6,2
5,6,3
5,6,4
5,6,7
5,7,1
5,7,2
5,7,3
5,7,4
5,7,6
6,1,2
6,1,3
6,1,4
6,1,5
6,1,7
6,2,1
6,2,3
6,2,4
6,2,5
6,2,7
6,3,1
6,3,2
6,3,4
6,3,5
6,3,7
6,4,1
6,4,2
6,4,3
6,4,5
6,4,7
6,5,1
6,5,2
6,5,3
6,5,4
6,5,7
6,7,1
6,7,2
6,7,3
6,7,4
6,7,5
7,1,2
7,1,3
7,1,4
7,1,5
7,1,6
7,2,1
7,2,3
7,2,4
7,2,5
7,2,6
7,3,1
7,3,2
7,3,4
7,3,5
7,3,6
7,4,1
7,4,2
7,4,3
7,4,5
7,4,6
7,5,1
7,5,2
7,5,3
7,5,4
7,5,6
7,6,1
7,6,2
7,6,3
7,6,4
7,6,5
共计210种情况
现在输出符合连续的情况
1,2,3
1,2,4
1,2,5
1,2,6
1,2,7
1,3,2
1,3,4
1,4,3
1,4,5
1,5,4
1,5,6
1,6,5
1,6,7
1,7,6
2,1,3
2,1,4
2,1,5
2,1,6
2,1,7
2,3,1
2,3,4
2,3,5
2,3,6
2,3,7
2,4,3
2,4,5
2,5,4
2,5,6
2,6,5
2,6,7
2,7,6
3,1,2
3,2,1
3,2,4
3,2,5
3,2,6
3,2,7
3,4,1
3,4,2
3,4,5
3,4,6
3,4,7
3,5,4
3,5,6
3,6,5
3,6,7
3,7,6
4,1,2
4,2,1
4,2,3
4,3,1
4,3,2
4,3,5
4,3,6
4,3,7
4,5,1
4,5,2
4,5,3
4,5,6
4,5,7
4,6,5
4,6,7
4,7,6
5,1,2
5,2,1
5,2,3
5,3,2
5,3,4
5,4,1
5,4,2
5,4,3
5,4,6
5,4,7
5,6,1
5,6,2
5,6,3
5,6,4
5,6,7
5,7,6
6,1,2
6,2,1
6,2,3
6,3,2
6,3,4
6,4,3
6,4,5
6,5,1
6,5,2
6,5,3
6,5,4
6,5,7
6,7,1
6,7,2
6,7,3
6,7,4
6,7,5
7,1,2
7,2,1
7,2,3
7,3,2
7,3,4
7,4,3
7,4,5
7,5,4
7,5,6
7,6,1
7,6,2
7,6,3
7,6,4
7,6,5
共计110种情况

7个球中取三个是C10

2.设一个关系为R(A,B,C,D,E,F,G),他的最小函数依赖是FD={A->B,A->C,C->D,C->E,A->F,F->G},该关系满足_范式,若要规划为高一级的范式,则得到_个关系。

答:该关系满足第二范式,规划为高一级,则得到3个关系 分别为 1.A,B,C,F 2.C,D,E 3.F,G
数据库相关

编程题

3.小猴子下山,沿着下山的路有一排桃树,每棵树都结了一些桃子。小猴子想摘桃子,但是有一些条件需要遵守,小猴子只能沿着下 山的方向走,不能回头,每颗树最多摘一个,而且一旦摘了一棵树的桃子,就不能再摘比这棵树结的桃子少的树上的桃子。那么小 猴子最多能摘到几颗桃子呢?举例说明,比如有5棵树,分别结了10,4,5,12,8颗桃子,那么小猴子最多能摘3颗桃子,来 自于结了4,5,8颗桃子的桃树。

/** 请完成下面这个函数,实现题目要求的功能 **/
        /** 当然,你也可以不按照这个模板来作答,完全按照自己的想法来 ^-^ **/


        static int pick(int[] peaches) {

        }
        public static void main(String[] args){
            Scanner in = new Scanner(System.in);
            int trees = Integer.parseInt(in.nextLine().trim());
            int[] peaches = new int[trees];
            for (int i = 0; i < peaches.length; i++) {
                peaches[i] = Integer.parseInt(in.nextLine().trim());
            }
            System.out.println(pick(peaches));
        }

解法,题目也可以意为剑指offer和编程之美中的最长递增子数列
思路:
用一个数组进行标记当前能得到多少个
假设共有n个值,其前(n-1)的可摘数已经算出
那么第n个的值为
如果当前值大于n-1的值,则当前为 n-1的值+1
不满足递推,全部不满足初始化为0;

  static int pick(int[] peaches) {
            //定义动态规划数组,与原数组大小相同
            int[] status=new int[peaches.length];


            for (int i = 0; i <peaches.length ; i++) {
                status[i]=1;
                for (int j = i-1; j >=0; j--) {
                    if (peaches[i]>peaches[j]&&(status[j]+1)>status[i]){
                        status[i]=status[j]+1;
                    }
                }
            }
            int Max=status[0];
            for (int i = 1; i < status.length; i++) {
                if (status[i]>Max){
                    Max=status[i];
                }
            }
            return Max;
        }
阅读更多
想对作者说点什么?

博主推荐

换一批

没有更多推荐了,返回首页