1. 程式人生 > >阿里2018秋招模擬筆試Java研發崗試題

阿里2018秋招模擬筆試Java研發崗試題

如何在MarkDown中新增公式

選擇題

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;
        }