2019百度/快手/美团/京东/电信云秋招编程题(一)

Hello,everyone!
我是CS科研GO,一个热衷于科研和软开的胖子!
今天为大家分享的是2019百度/快手/美团/京东/电信云的秋招编程题。

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

内容靠得住,关注不迷路。
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/y609532842/article/details/106347639