老虎证券的笔试题,相对来说还是比较简单的,两道题都ac了(近期唯一一次)
第一题:
输入:思路:找出最小的上车站点和最大的下车站点,计算出在这个区间中,什么时候有最多的乘客在车上,找到这个最多乘客在车上的数量,除以capacity,再+1就ok了trips:二维int数组,用于表示一组乘客的行程信息,其中`trip[i]`表示第i组乘客,`trip[i][0]`表示第i组乘客的乘客数量,`trip[i][1]`表示上车站点,`trip[i][2]`表示下车站点capacity: int 类型,表示每辆车最多能承载多少名乘客
输出:最少需要多少辆车可以满足乘客需求
代码:
public static int minCarCount (int[][] trips, int capacity) { // write code here Arrays.sort(trips, ((o1, o2) -> o1[1] - o2[1])); int k = 0; int start = trips[0][1]; int end = trips[trips.length-1][2]; for (int i = start; i < end; i++) { float x = i + 0.5f; int count = 0; for (int j = 0; j < trips.length; j++) { if (x > trips[j][1] && x < trips[j][2]) { count += trips[j][0]; } } k = Math.max(count, k); } return k/5+1; }第二题:
输入:要求:当前等级大于任务所需最低等级时,才能选择该任务x:int整型 需要完成的任务数量 level: int整型 初始等级tasks: int整型二维数组 表示可供选择的任务,tasks[i][0]表示第i个任务所需的最低等级,task[i][1]表示第i个任务完成后能提升的等级
输出:
做完x个任务后能达到的最高等级思路:
很明显的贪心,每次选择任务的时候,都尽量去选择可以获得等级最多的任务就ok了
代码:
public static int maxLevel (int x, int level, int[][] tasks) { // write code here if (x == 0) { return level; } Arrays.sort(tasks, (o1, o2) -> o1[0] - o2[0]); if (level < tasks[0][0]) { return level; } Arrays.sort(tasks, (o1, o2) -> o2[1] - o1[1]); HashSet<Integer> set = new HashSet<>(); for (int i = 0; i < x; i++) { for (int j = 0; j < tasks.length; j++) { if (!set.contains(j) && level >= tasks[j][0]) { level += tasks[j][1]; set.add(j); break; } else if (set.contains(j)) { continue; } } } return level; }
全部评论
(2) 回帖