春招惨痛,目前仍颗粒无收。 做了阿里、字节、华为的笔试,除了字节是LeetCode风格,阿里华为都偏向ACM模式,而这正是我不熟悉的。 前车之鉴,后事之师,教训如被人接受,此经验可贵十倍。因此记录下笔试题目。
1、新员工的答题情况(100分)
新员工入职公司,参加考试,其中判断题10道(每题2分),单选题10道(每题4分),多选题5道(每题8分)。只能顺序作答,答完题不知道对错,答对得分,答错不得分。答错累计三道,则终止考试。输入考试结果分数,输出答题可能情况个数。
补充:关于回溯和DFS
在具体的做题时,似乎回溯总是和DFS一起出现,但两者到底是什么关系呢? 借鉴知乎用户Aetherus的答案 回溯和DFS的区别, “回溯的关键不在于递归,而在于状态。在回溯算法向前的每一步,你都会去设置某个状态,而当向前走走不通的时候回退,此时需要把之前设置的状态撤销掉。DFS 只是找某个或某些满足条件的东西而已,找到就返回,找不到拉倒,没状态啥事儿。” 语言淳朴,浅显易懂。
所以本题采用回溯的思想,以DFS为工具。
public class Main {
public static int[] score = {2,2,2,2,2,2,2,2,2,2,4,4,4,4,4,4,4,4,4,4,8,8,8,8,8};
private static int N;
private static int sum;
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
N = sc.nextInt();
backTrace(0, 0, 0);
System.out.print(sum);
}
public static void backTrace(int index, int score, int err) {
if (err >= 3) return;
if (score == N) {
sum++;
return;
}
if (score > N) return;
for (int i = index; i < score.length; i++) {
score += score[i];
backTrace(i + 1, score, err);
score -= score[i];
err++;
}
}
}
|