2019京東/快手/美團/百度Java開發崗秋招編程題(一)

Hello,everyone!
我是CS科研GO,一個熱衷於科研和軟開的胖子!
今天爲大家分享的是2019京東和快手Java開發崗的秋招編程題。

  1. (京東)有一樓梯共m級,剛開始時你在第一級,若每次只能跨上一級或者二級,要走上m級,共有多少走法?
    注:規定從一級到一級有0種走法。
    輸入數據:一個整數n (1<=n<=100),表示測試實例數,然後輸入N行數據,每行包含一個整數m(1<=m<=40),表示樓梯的級數。
    輸出數據:對於每個測試實例,請輸出不同走法的數量。
    輸入樣本: 2 2 3。
    輸出樣本: 1 2。
//解題思路:斐波那契數列

import java.util.Scanner;

public class Main {

    public static int getResult(int m) {
        int[] floor = new int[41];
        floor[0] = 0;
        floor[1] = 0;
        floor[2] = 1;
        floor[3] = 2;
        for (int i = 0; i <= m; i++) {
            if (i > 3) {
                floor[i] = floor[i - 2] + floor[i - 1];
            }
        }
        return floor[m];
    }

    public static void main(String[] args) {
        // write your code here
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        int m[] = new int[n];
        for (int i = 0; i < n; i++) {
            m[i] = sc.nextInt();
        }
        for (int i = 0; i < n; i++) {
            System.out.println(getResult(m[i]));
        }

    }
}
  1. (京東)小東和三個朋友一起在樓上拋小球,他們站在樓房中不同樓層,假設小東站的樓層距離地面N米,球從他手裏自由落下,每次落地後反跳回上次下落高度的一半,並以此類推直到全部落到地面不跳,求4個小球一共經過了多少米?(數字都爲整數)
    給定四個整數A,B,C,D,請返回所求結果。
// 這個題還是比較好搞的,問題的關鍵在於要想清楚小球掉落後的運動過程。
import java.util.Scanner;

public class Main {

    public static int getResult(int height) {
        int result = 0;
        result += height;
        while (height > 0) {
            result += height / 2 * 2;
            height = height / 2;
        }
        return result;
    }

    public static void main(String[] args) {
        // write your code here
        Scanner sc = new Scanner(System.in);
        int final_result = 0;
        for (int i = 0; i < 4; i++) {
            final_result = final_result + getResult(sc.nextInt());
        }
        System.out.println(final_result);
    }

}
  1. (快手)給滿出二叉樹,編寫算法將其轉化爲求和樹
什麼是求和樹:二叉樹的求和樹, 是一顆同樣結構的二叉樹,其樹中的每個節點將包含原始樹中的左子樹和右子樹的和。

二叉樹:
                  10
               /      \
             -2        6
           /   \      /  \ 
          8    -4    7    5

求和樹:
                 20(4-2+12+6)
               /      \
           4(8-4)      12(7+5)
            /   \      /  \ 
          0      0    0    0
注:二叉樹給出前序和中序輸入,求和樹要求中序輸出;所有處理數據不會大於int;
輸入數據:2行整數,第1行表示二叉樹的前序遍歷,第2行表示二叉樹的中序遍歷,以空格分割。
輸出數據:1行整數,表示求和樹的中序遍歷,以空格分割
輸入樣本:
10 -2 8 -4 6 7 5
8 -2 -4 10 7 6 5
輸出樣本: 
0 4 0 20 0 12 0

第3題答案傳送門,答主寫的很好,代碼規範,無需註釋也可以懂,推薦。

  1. (快手)小明有一袋子長方形的積木,如果一個積木A的長和寬都不大於另外一個積木B的長和寬,則積木A可以搭在積木B的上面。好奇的小明特別想知道這一袋子積木最多可以搭多少層,你能幫他想想辦法嗎?
    定義每一個長方形的長L和寬W都爲正整數,並且1 <= W <= L <= INT_MAX, 袋子裏面長方形的個數爲N, 並且 1 <= N <= 1000000.
    假如袋子裏共有5個積木分別爲 (2, 2), (2, 4), (3, 3), (2, 5), (4, 5), 則不難判斷這些積木最多可以搭成4層, 因爲(2, 2) < (2, 4) < (2, 5) < (4, 5)。
    輸入數據:第一行爲積木的總個數 N,之後一共有N行,分別對應於每一個積木的寬W和長L
    輸出數據:輸出總共可以搭的層數
    輸入樣本
    5
    2 2
    2 4
    3 3
    2 5
    4 5
    輸出樣本
    4
import java.util.Scanner;
import java.util.*;


public class Main {

    public static int Select(int[] temp, int num_level, int k){
        int low = 0;
        int high = num_level - 1;
        while (low <= high) {
            int mid = (low + high) >>> 1;
            int midVal = temp[mid];
            if(midVal < k)
                high = mid - 1;
            else if(midVal > k)
                low = mid + 1;
            else
                return mid;
        }
        return high;
    }


    public static void main(String[] args){
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        int[][] m = new int[n][2];
        for(int i = 0; i < n; i++){
            m[i][0] = sc.nextInt();
            m[i][1] = sc.nextInt();
        }
        // 將備胎女友按重要性從高到低排列
        Arrays.sort(m, (o1, o2) -> {
            if(o1[0] != o2[0])
                return Integer.compare(o2[0], o1[0]);
            else{
                return Integer.compare(o2[1], o1[1]);
            }
        });
        int[] temp = new int[m.length + 1];
        Arrays.fill(temp, 1000000000);
        int num_level = 0;
        for(int i = 0; i < m.length; i++){
            if(m[i][1] <= temp[num_level]){
                num_level++;
                temp[num_level] = m[i][1];
            }else{
                int res = Select(temp, num_level, m[i][1]);
                temp[res + 1] = m[i][1];
            }
        }
        System.out.println(num_level);
    }
}

內容靠得住,關注不迷路。
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章