当前位置: 首页 > news >正文

力扣(leetcode)每日一题 1656 设计有序流

1656. 设计有序流 - 力扣(LeetCode)

题目

有 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,说明连续,就可以进行弹出。并且index加1 这里的写法不好理解
假如我有一个长度5的stream。然后一次放5,4,3,2,这时候index队列为
4 4 3 2 1
当放1的时候形成 5 4 3 2 1 就可以全部弹出。就像是楼梯一样。

class OrderedStream {
    int index = 1;
    int[] indexlist;
    String[] valuelist;

    public OrderedStream(int n) {
        indexlist = new int[n + 1];
        valuelist = new String[n + 1];
    }

    public List<String> insert(int idKey, String value) {
        for (int i = index; i <= idKey; i++) {
            indexlist[i]++;
        }
        valuelist[idKey] = value;
        List<String> list = new ArrayList<>();
        while ((index == indexlist.length - 1 && valuelist[indexlist.length - 1] != null)
            || (index < indexlist.length - 1 && indexlist[index] == indexlist[index + 1] + 1)) {
                // index如果为最后一个,并且有值一定要弹出。如果不是最后一个需要判断是否和下一个差1
            list.add(valuelist[index]);
            index++;
        }
        return list;
    }
}

image.png

解法二 上面的思路比较乱,进行了简化
 class OrderedStream {  
    int index = 1;  
    HashMap<Integer, String> map;  
  
    public OrderedStream(int n) {  
        map = new HashMap<>();  
    }  
  
    public List<String> insert(int idKey, String value) {  
        map.put(idKey, value);  
        List<String> res = new ArrayList<>();  
        // 如果有,就加入队列弹出。并且index加一。这里覆盖了各种极端情况,弹出一个,越界等  
        while (map.get(index) != null) {  
            String s = map.get(index);  
            res.add(s);  
            index++;  
        }  
        return res;  
    }  
}

image.png

解法三 将上面的map改为数组
class OrderedStream {  
    int index = 1;  
    String[] valuelist;  
  
    public OrderedStream(int n) {  
        valuelist = new String[n + 1];  
    }  
  
    public List<String> insert(int idKey, String value) {  
        valuelist[idKey] = value;  
        List<String> res = new ArrayList<>();  
        // 如果有,就加入队列弹出。并且index加一。这里覆盖了各种极端情况,弹出一个,越界等  
        while (index != valuelist.length && valuelist[index] != null) {  
            String s = valuelist[index];  
            res.add(s);  
            index++;  
        }  
        return res;  
    }  
}

image.png

image.png
这已经是最优解了,刷新一下就变成了前百分之96了

总结

解法一没有很简洁,但是是最先想到的。反而越是简单精妙的结构,越是不好短时间抽象出来

相关文章:

  • 2025 年 Java 面试高频手写代码题(附核心实现)
  • 本地部署deepseek大模型后使用c# winform调用(可离线)
  • 某查”平台请求头反爬技术解析与应对
  • css selector
  • docker部署go简单web项目(无mysql等附加功能)
  • Ubuntu从零创建Hadoop集群
  • FS800DTU联动OneNET平台数据可视化View
  • c#编程:SortedList与Dictionary的比较 与 选择
  • Vue3 + Vite + TS,使用 配置项目别名属性:server
  • 如何避免过度依赖某个云服务商
  • 什么是可重入,什么是可重入锁? 它用来解决什么问题?
  • 在vscode中编译运行c语言文件,配置并运行OpenMP多线程并行程序设计
  • ros进阶——强化学习倒立摆的PG算法实现
  • 高斯消元法
  • 如何通过云计算实现业务的持续创新?
  • YOLOv11-ultralytics-8.3.67部分代码阅读笔记-validator.py
  • AI前端赋能医疗诊断:效率与精准的双重跃升
  • 社群团购平台的愿景构建与开源链动2+1模式S2B2C商城小程序应用探索
  • 【AI 接入工作流实操指南与示例解析】
  • 嵌入式软件数据结构(一)链表知识点专栏 附源码 附原理
  • h5如何做多页面网站/百度搜索引擎营销
  • 怎么做传奇私服网站/网站建设是什么工作
  • 怀化订水网站/百度站长资源
  • 网站开发 搜索/企业信息查询
  • 电脑网页制作软件下载/seopeix
  • 在闲鱼可以做网站吗/企业文化理念