大疆 客户端开发 笔经(已凉)
2020.08.16 晚上 笔试 2h
1)于是他想到一个计划,他先将每个游戏标上一个成就值,同时对每个游戏都估算一个通关所需要的天数,他计划在未来X天内让自己玩游戏的成就达到最大,那么他应该怎么做计划呢?(假设每个游戏最多只计划玩一遍,而且每个游戏必须玩完通关才能取得成就值,且通关每个游戏最小时间单位是1天)
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int x = sc.nextInt();
int[] a = new int[n];
int[] b = new int[n];
for (int i = 0; i < n; i++) {
a[i] = sc.nextInt();
b[i] = sc.nextInt();
}
int[][] dp = new int[n + 1][x + 1];
for (int i = 0; i < n; i++) {
for (int j = 1; j <= x; j++) {
if(j >= b[i]) {
dp[i + 1][j] = Math.max(dp[i][j], dp[i][j - b[i]] + a[i]);
} else {
dp[i + 1][j] = dp[i][j];
}
}
}
System.out.println(dp[n][x]);
}
}
2)题目是这样的:给定一个非负的、字符串形式的整形数字,例如"12353789",字符串的长度也就是整形数字的位数不超过10000位,并且字符串不会以0开头,小C需要挑选出其中K个数字(K小于字符串的长度)并删掉他们,使得剩余字符组成新的整数是最小的。
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String s = sc.nextLine();
int k = sc.nextInt();
System.out.println(new Main().deleteKNums(s, k));
}
public String deleteKNums (String s, int k) {
StringBuilder sb = new StringBuilder();
int n = s.length();
char[] chars = new char[n];
int cnt = 0;
for (int i = 0; i < n; i++) {
while (k > 0 && cnt > 0 && s.charAt(i) < chars[cnt - 1]) {
k--;
cnt--;
}
chars[cnt++] = s.charAt(i);
}
int idx = 0;
while (idx < cnt && chars[idx] == '0') {
idx++;
}
if(idx == cnt) {
return "0";
}
while(idx < cnt) {
sb.append(chars[idx++]);
}
return sb.toString();
}
}
第一题没做,第二题100%,第三题82%。
#大疆##校招##笔经##Android#