Hello,everyone!
我是CS科研GO,一个热衷于科研和软开的胖子!
今天为大家分享的是2019百度/快手/美团/京东/电信云的秋招编程题。
- (京东)有一楼梯共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]));
}
}
}
- (京东)小东和三个朋友一起在楼上抛小球,他们站在楼房中不同楼层,假设小东站的楼层距离地面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);
}
}
- (快手)给满出二叉树,编写算法将其转化为求和树
什么是求和树:二叉树的求和树, 是一颗同样结构的二叉树,其树中的每个节点将包含原始树中的左子树和右子树的和。
二叉树:
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题答案传送门,答主写的很好,代码规范,无需注释也可以懂,推荐。
- (快手)小明有一袋子长方形的积木,如果一个积木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);
}
}
内容靠得住,关注不迷路。