Hello,everyone!
我是CS科研GO,一個熱衷於科研和軟開的胖子!
今天爲大家分享的是2019京東和快手Java開發崗的秋招編程題。
- (京東)有一樓梯共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);
}
}
內容靠得住,關注不迷路。