• 【数组】设计有序流


    问题描述

    有 n 个 (id, value) 对,其中 id 是 1 到 n 之间的一个整数,value 是一个字符串。不存在 id 相同的两个(id, value) 对。

    设计一个流,以 任意 顺序获取 n个(id, value)对,并在多次调用时 按 id 递增的顺序 返回一些值。

    实现 OrderedStream 类:

    • OrderedStream(int n) 构造一个能接收 n 个值的流,并将当前指针 ptr 设为 1 。
    • String[] insert(int id, String value) 向流中存储新的 (id, value) 对。存储后:
      • 如果流存储有 id = ptr 的 (id, value) 对,则找出从 id = ptr 开始的 最长 id 连续递增序列 ,并 按顺序 返回与这些 id 关联的值的列表。然后,将 ptr 更新为最后那个 id + 1。
      • 否则,返回一个空列表。

    示例1:

    输入
    ["OrderedStream", "insert", "insert", "insert", "insert", "insert"]
    [[5], [3, "ccccc"], [1, "aaaaa"], [2, "bbbbb"], [5, "eeeee"], [4, "ddddd"]]
    输出
    [null, [], ["aaaaa"], ["bbbbb", "ccccc"], [], ["ddddd", "eeeee"]]

    解释
    OrderedStream os= new OrderedStream(5);
    os.insert(3, "ccccc"); // 插入 (3, "ccccc"),返回 []
    os.insert(1, "aaaaa"); // 插入 (1, "aaaaa"),返回 ["aaaaa"]
    os.insert(2, "bbbbb"); // 插入 (2, "bbbbb"),返回 ["bbbbb", "ccccc"]
    os.insert(5, "eeeee"); // 插入 (5, "eeeee"),返回 []
    os.insert(4, "ddddd"); // 插入 (4, "ddddd"),返回 ["ddddd", "eeeee"]

    解题思路 

    这里就是字符串数组的操作,按照题目描述:

    1. 提供一个values[]用于记录数组信息 和 pr用于记录索引位置;
    2. insert操作,直接更新values[idKey-1] = value;
    3. 构造返回结果,从pr开始遍历,并且values[pr]不为空,则把数据添加到结果List中,并返回该结果。

    如下图所示:

    代码实现

    1. import java.util.ArrayList;
    2. import java.util.List;
    3. class OrderedStream1 {
    4. String[] values;
    5. int pr;
    6. public OrderedStream1(int n) {
    7. this.values = new String[n];
    8. this.pr = 0;
    9. }
    10. public List insert(int idKey, String value) {
    11. this.values[idKey - 1] = value;
    12. // 计算pr值
    13. List res = new ArrayList<>(values.length);
    14. while (pr < values.length && values[pr] != null) {
    15. res.add(values[pr++]);
    16. }
    17. return res;
    18. }
    19. public static void main(String[] args) {
    20. OrderedStream1 orderedStream = new OrderedStream1(5);
    21. System.out.println(orderedStream.insert(3, "ccccc"));
    22. System.out.println(orderedStream.insert(1, "aaaaa"));
    23. System.out.println(orderedStream.insert(2, "bbbbb"));
    24. System.out.println(orderedStream.insert(5, "eeeee"));
    25. System.out.println(orderedStream.insert(4, "ddddd"));
    26. }
    27. }

    总结

    这是一道字符串数组操作的题目,看起来在模拟网络传输时填充一个有序流。按照题目要求只需要,充分利用字符数组+指针pr,就能完成。如果有更好的思路,欢迎回复。

  • 相关阅读:
    13、Java——“21点”扑克游戏系统(变量+循环)
    networkX-04-查找k短路
    php 剪裁背景图,滑动图片,滑动验证
    基于selenium的pyse自动化测试框架
    开源模型应用落地-工具使用篇-Ollama(六)
    python利用pandas.DataFram批量写入clickhouse
    模拟量偏差报警功能块(SCL代码)
    Unity中的MVC思想
    146. LRU 缓存
    陪诊小程序的市场潜力与发展趋势研究
  • 原文地址:https://blog.csdn.net/weiliuhong1/article/details/126376610