当前位置:   article > 正文

笔试算法复盘_华为0508笔试 时间轴上有n种周期出现的资源,每种资源有周期和偏移

华为0508笔试 时间轴上有n种周期出现的资源,每种资源有周期和偏移

请设计一种虚拟机解释器,能解析并执行以下虚拟指令。 虚拟机约定:32位整形寄存器:a0,a1....a31,共32个寄存器; 整个虚拟机只有寄存器和立即数参与计算。 规则集(dst一定为寄存器,src为寄存器或十进制正整数,运算结果存在负数场景):
1. MOV dst src 含义:dst= src
2. ADD dst src0 src1 含义:dst= src0 + src1
3. SUB dst src0 src1 含义:dst=src0-src1
4. MUL dst srco src1 含义:dst=src0*src1
5. DlV dst src0 src1 含义:dst=src0/src1(结果向下取整)
6. PRINT dst 含义:打印dst寄存器值 约束:不用考虑计算溢出(用例保证),指令数最多100条,至少一条PRINT指令,寄存器保证先赋值再引用。不用考虑小数跟除0。

  1. import java.util.HashMap;
  2. import java.util.Scanner;
  3. public class test {
  4. HashMap<String, Integer> map = new HashMap<>();
  5. public static void main(String[] args) {
  6. Scanner scanner = new Scanner(System.in);
  7. StringBuilder stringBuilder = new StringBuilder();
  8. while (scanner.hasNextLine()) {
  9. String line = scanner.nextLine();
  10. if (line.isEmpty()) {
  11. break;
  12. }
  13. stringBuilder.append(line).append("\n");
  14. }
  15. String[] split = stringBuilder.toString().split("\n");
  16. test test = new test();
  17. test.excuteCommand(split);
  18. }
  19. public void excuteCommand(String[] commands) {
  20. for(String command : commands) {
  21. String[] s = command.split(" ");
  22. String instruction = s[0];
  23. switch (instruction) {
  24. case "MOV":
  25. map.put(s[1], parseIntPlus(s[2]));
  26. break;
  27. case "ADD":
  28. map.put(s[1], parseIntPlus(s[2]) + parseIntPlus(s[3]));
  29. break;
  30. case "SUB":
  31. map.put(s[1], parseIntPlus(s[2]) - parseIntPlus(s[3]));
  32. break;
  33. case "MUL":
  34. map.put(s[1], parseIntPlus(s[2]) * parseIntPlus(s[3]));
  35. break;
  36. case "DIV":
  37. map.put(s[1], parseIntPlus(s[2]) / parseIntPlus(s[3]));
  38. break;
  39. case "PRINT":
  40. System.out.println(map.get(s[1]));
  41. break;
  42. }
  43. }
  44. }
  45. public Integer parseIntPlus(String s) {
  46. // 方法1
  47. try{
  48. return Integer.parseInt(s);
  49. } catch (Exception e) {
  50. return map.get(s);
  51. }
  52. // 方法2
  53. // if (s.matches("-?\\d+")) { // check if it's a number
  54. // return Integer.parseInt(s);
  55. // } else { // it's a register name
  56. // return map.getOrDefault(s, 0);
  57. // }
  58. }
  59. }

 无线通信移动性需要在基站上配置邻区(本端基站的小区LocalCell与周边邻基站的小区NeighborCell映射)关系,为了能够加速无线算法的计算效率,设计一个邻区关系缓存表,用于快速的通过本小区LocalCell查询到邻小区NeighborCel。但是缓存表有一定的规格限制,因此到达规格并且需要插入新的数据时,需要删除邻区数据,选择删除邻区数据对象的策略为:1)使用次数最少的,2)如果1)返回有多个对象,则选择最久未使用的。 请设计并实现一个满足以上要求的数据结构和算法实现。 注:假设每个LocalCell至多只有一个NeighborCell。 输入:

1、首行以字符"capacity:"标识设置一个整数容量

2、以"write:"标识开始进行若干组[LocalCell,NeighborCel] 邻区数据的输入,每组数据为一行;如果"write:"已经存在的LocalCell数据,更新其对应的NeighborCell,并刷新使用时间和次数加1;如果某邻区数据被删除,缓存表不再保留其记录;

3、以"read:"标识进行一次读取LocalCell的使用操作,刷新使用时间和次数加1;

4、最后以"query:"标识查询输出操作,输入正整数LocalCell,查询NeighborCell;

输出:

每个查询输入正整数LocalCell对应NeighborCell,表示在邻区关系缓存表中的记录。

  1. package com.hmdp.utils;
  2. import java.sql.Time;
  3. import java.util.HashMap;
  4. import java.util.Map;
  5. import java.util.Scanner;
  6. import java.util.Timer;
  7. class CachNode{
  8. int localCell;
  9. int neighborCell;
  10. long time;
  11. int cnt;
  12. public CachNode(int localCell, int neighborCell) {
  13. this.localCell = localCell;
  14. this.neighborCell = neighborCell;
  15. this.time = System.nanoTime();
  16. this.cnt = 1;
  17. }
  18. }
  19. class LRUCache{
  20. int capacity;
  21. HashMap<Integer, CachNode> map;
  22. public LRUCache(int capacity) {
  23. this.capacity = capacity;
  24. this.map = new HashMap<>();
  25. }
  26. public int get(int localCell) {
  27. CachNode node = map.get(localCell);
  28. if(node != null) return -1;
  29. node.cnt++;
  30. node.time = System.nanoTime();
  31. return node.neighborCell;
  32. }
  33. public void put(int localCell, int neighborCell){
  34. if(map.containsKey(localCell)) {
  35. CachNode node = map.get(localCell);
  36. node.cnt++;
  37. node.time = System.nanoTime();
  38. node.neighborCell = neighborCell;
  39. return;
  40. }
  41. if(map.size() >= capacity) {
  42. int minCnt = Integer.MAX_VALUE;
  43. long minTime = Long.MAX_VALUE;
  44. int removeNode = 0;
  45. for(CachNode node : map.values()) {
  46. if(node.cnt < minCnt || (node.cnt == minCnt && node.time < minTime)) {
  47. minCnt = node.cnt;
  48. minTime = node.time;
  49. removeNode = node.localCell;
  50. }
  51. }
  52. map.remove(removeNode);
  53. }
  54. map.put(localCell, new CachNode(localCell, neighborCell));
  55. }
  56. }
  57. public class test {
  58. public static void main(String[] args) {
  59. Scanner scanner = new Scanner(System.in);
  60. LRUCache lruCache = null;
  61. while (scanner.hasNextLine()) {
  62. String line = scanner.nextLine().trim();
  63. if (line.startsWith("capacity:")) {
  64. int capacity = Integer.parseInt(scanner.nextLine());
  65. lruCache = new LRUCache(capacity);
  66. } else if (line.startsWith("write:")) {
  67. int writeCount = Integer.parseInt(scanner.nextLine().trim());
  68. for (int i = 0; i < writeCount; i++) {
  69. String[] parts = scanner.nextLine().trim().split(" ");
  70. int localCell = Integer.parseInt(parts[0]);
  71. int neighborCell = Integer.parseInt(parts[1]);
  72. lruCache.put(localCell, neighborCell);
  73. }
  74. } else if (line.startsWith("read:")) {
  75. int localCell = Integer.parseInt(scanner.nextLine().trim());
  76. lruCache.get(localCell);
  77. } else if (line.startsWith("query:")) {
  78. int localCell = Integer.parseInt(scanner.nextLine().trim());
  79. int result = lruCache.get(localCell);
  80. System.out.println(result);
  81. return;
  82. }
  83. }
  84. }
  85. }

时间轴上有N种周期出现的资源,每种资源Rx的都有自己的周期period x和偏置ofset x,且资源的period/offset对不重复。求可以包含所有种类资源点的最小窗口的起始位置以及长度,由于满足条件的窗口会有若干个,所以只需要返回起始位置最小的窗口。

说明: 1、资源在时间轴上周期出现,例如资源对应的period,offset分别为(10,3),那么该资源在时间轴上的位置为3,13,23.…,时间轴的最大值不超过INT MAX;2、最小窗口需要满足每种资源至少包含一次,但是可以包含多次;3、窗口大小至少为1。

输入: 第一行为资源的种类数;N,取值范围[1,10],第二行为N种资源对应的period和offset,period取值范围(0,512],ofset为小于对应period的自然数;

输出: 满足覆盖N种资源的最小窗口的起始位置以及长度(每个资源至少包含一次),以空格隔开。

 

  1. package com.hmdp.utils;
  2. import java.util.*;
  3. public class test {
  4. public static void main(String[] args) {
  5. Scanner scanner = new Scanner(System.in);
  6. // 读取资源的种类数
  7. int N = scanner.nextInt();
  8. // 读取每种资源的周期和偏置
  9. int[] periods = new int[N];
  10. int[] offsets = new int[N];
  11. for (int i = 0; i < N; i++) {
  12. periods[i] = scanner.nextInt();
  13. offsets[i] = scanner.nextInt();
  14. }
  15. // 找出包含所有资源的最小窗口
  16. int[] result = findMinWindow(N, periods, offsets);
  17. System.out.println(result[0] + " " + result[1]);
  18. }
  19. private static int[] findMinWindow(int N, int[] periods, int[] offsets) {
  20. List<int[]> points = new ArrayList<>();
  21. for (int i = 0; i < N; i++) {
  22. int period = periods[i];
  23. int offset = offsets[i];
  24. for (int j = 0; j < N; j++) {
  25. points.add(new int[]{offset + j * period, i});
  26. }
  27. }
  28. // 按位置排序
  29. Collections.sort(points, (a, b) -> Integer.compare(a[0], b[0]));
  30. int[] count = new int[N];
  31. int distinctCount = 0;
  32. int left = 0;
  33. int minLength = Integer.MAX_VALUE;
  34. int minStart = 0;
  35. for (int right = 0; right < points.size(); right++) {
  36. int type = points.get(right)[1];
  37. if (count[type] == 0) {
  38. distinctCount++;
  39. }
  40. count[type]++;
  41. while (distinctCount == N) {
  42. int start = points.get(left)[0];
  43. int end = points.get(right)[0];
  44. int length = end - start + 1;
  45. if (length < minLength) {
  46. minLength = length;
  47. minStart = start;
  48. }
  49. int leftType = points.get(left)[1];
  50. count[leftType]--;
  51. if (count[leftType] == 0) {
  52. distinctCount--;
  53. }
  54. left++;
  55. }
  56. }
  57. return new int[]{minStart, minLength};
  58. }
  59. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/IT小白/article/detail/664006
推荐阅读
相关标签
  

闽ICP备14008679号