前言

前三题比较简单,第二题一开始没好好读题,稍微踩了点坑。最后一题暴力模拟,差几个点过,优化了半个小时也没什么进展。只对了3题居然也进前300了,整挺好。

第一题:设计停车系统

题解一:模拟

模拟,没啥好说的。

  1. class ParkingSystem {
  2. private int big;
  3. private int medium;
  4. private int small;
  5. public ParkingSystem(int big, int medium, int small) {
  6. this.big = big;
  7. this.medium = medium;
  8. this.small = small;
  9. }
  10. public boolean addCar(int carType) {
  11. switch (carType) {
  12. case 1:
  13. if (big > 0) {
  14. big--;
  15. return true;
  16. }
  17. break;
  18. case 2:
  19. if (medium > 0) {
  20. medium--;
  21. return true;
  22. }
  23. break;
  24. case 3:
  25. if (small > 0) {
  26. small--;
  27. return true;
  28. }
  29. break;
  30. }
  31. return false;
  32. }
  33. }
  34. /**
  35. * Your ParkingSystem object will be instantiated and called as such:
  36. * ParkingSystem obj = new ParkingSystem(big, medium, small);
  37. * boolean param_1 = obj.addCar(carType);
  38. */

第二题:警告一小时内使用相同员工卡大于等于三次的人

题解一:哈希表+排序

用哈希表存储不同用户的打卡时间,将时间转换成 int 形式存储并排序,依次遍历判断是否有符合题目要求的情况,最后对结果再进行排序。

  1. import java.util.*;
  2. class Solution {
  3. public List<String> alertNames(String[] keyName, String[] keyTime) {
  4. final int n = keyName.length;
  5. Map<String, List<Integer>> map = new HashMap<>();
  6. for (int i = 0; i < n; ++i) {
  7. int time = parse(keyTime[i]);
  8. if (map.containsKey(keyName[i])) {
  9. List list = map.get(keyName[i]);
  10. list.add(time);
  11. map.put(keyName[i], list);
  12. } else {
  13. List list = new ArrayList(100);
  14. list.add(time);
  15. map.put(keyName[i], list);
  16. }
  17. }
  18. Comparator<Integer> integerComparator = new Comparator<Integer>() {
  19. @Override
  20. public int compare(Integer o1, Integer o2) {
  21. return o1.compareTo(o2);
  22. }
  23. };
  24. List<String> ans = new LinkedList<>();
  25. for (Map.Entry<String, List<Integer>> i : map.entrySet()) {
  26. List<Integer> list = i.getValue();
  27. list.sort(integerComparator);
  28. if (judge(list)) {
  29. ans.add(i.getKey());
  30. }
  31. }
  32. Comparator<String> stringComparator = new Comparator<String>() {
  33. @Override
  34. public int compare(String o1, String o2) {
  35. return o1.compareTo(o2);
  36. }
  37. };
  38. ans.sort(stringComparator);
  39. return ans;
  40. }
  41. private int parse(String keyTime) {
  42. String[] times = keyTime.split(":");
  43. int hour = Integer.parseInt(times[0]);
  44. int minute = Integer.parseInt(times[1]);
  45. return hour * 60 + minute;
  46. }
  47. private boolean judge(List<Integer> list) {
  48. final int len = list.size();
  49. for (int i = 0; i < len - 2; ++i) {
  50. int begin = list.get(i);
  51. if ((list.get(i + 1) - begin <= 60) && (list.get(i + 2) - begin <= 60)) {
  52. return true;
  53. }
  54. }
  55. return false;
  56. }
  57. }

第三题:给定行和列的和求可行矩阵

题解一:数学

一开始还想着暴搜先试试,看了眼数据范围就放弃了。尝试寻找一种数学方法,保证能给出一种可行矩阵。其实很简单,每个格子填上其行列和的较小值,更新剩余所需的行列和就可以发现有一个已经为0了,那么这一行/列后续都填上0即可。这样同时可以保证和被用完。

  1. class Solution {
  2. public int[][] restoreMatrix(int[] rowSum, int[] colSum) {
  3. final int row = rowSum.length;
  4. final int col = colSum.length;
  5. int[][] ans = new int[row][col];
  6. for (int i = 0; i < row; ++i) {
  7. for (int j = 0; j < col; ++j) {
  8. ans[i][j] = Math.min(rowSum[i], colSum[j]);
  9. rowSum[i] -= ans[i][j];
  10. colSum[j] -= ans[i][j];
  11. }
  12. }
  13. return ans;
  14. }
  15. }

第四题:找到处理最多请求的服务器

题解一:模拟(超时)

维护各个服务器的状态,并用集合存储忙碌的服务器,每次请求到来是更新剩余所需时间,依次遍历找到下一个可用服务器,最后统计处理请求最多的服务器。
数据最大的几个点超时了,我感觉可以从找下一个可用服务器上进行优化,但是一直到比赛结束都没成功。

  1. import java.util.*;
  2. class Solution {
  3. public List<Integer> busiestServers(int k, int[] arrival, int[] load) {
  4. Server[] servers = new Server[k];
  5. Set<Server> busyServer = new HashSet<>();
  6. for (int i = 0; i < k; ++i) {
  7. servers[i] = new Server(i);
  8. }
  9. for (int i = 0; i < arrival.length; ++i) {
  10. for (Iterator<Server> it = busyServer.iterator(); it.hasNext(); ) {
  11. Server server = it.next();
  12. server.rest -= arrival[i] - arrival[i - 1];
  13. if (server.rest <= 0) {
  14. server.isBusy = false;
  15. it.remove();
  16. }
  17. }
  18. if (busyServer.size() == k) {
  19. continue;
  20. }
  21. int index = i % k;
  22. while (servers[index].isBusy) {
  23. index = (index + 1) % k;
  24. }
  25. servers[index].isBusy = true;
  26. servers[index].rest = load[i];
  27. servers[index].taskCnt++;
  28. busyServer.add(servers[index]);
  29. }
  30. int max = 0;
  31. List<Integer> ans = null;
  32. for (Server i : servers) {
  33. if (i.taskCnt > max) {
  34. max = i.taskCnt;
  35. ans = new LinkedList<>();
  36. ans.add(i.id);
  37. } else if (i.taskCnt == max) {
  38. ans.add(i.id);
  39. }
  40. }
  41. return ans;
  42. }
  43. }
  44. class Server {
  45. // 编号
  46. int id;
  47. // 当前是否在处理请求
  48. boolean isBusy;
  49. // 剩余处理时间
  50. int rest;
  51. // 总处理任务数
  52. int taskCnt;
  53. public Server(int id) {
  54. this.id = id;
  55. this.isBusy = false;
  56. this.rest = 0;
  57. this.taskCnt = 0;
  58. }
  59. }