如何将 PriorityQueue 恢复到方法调用之前的初始状态?

2024-04-22

我正在做一道练习题

这个问题基本上是你传入一个 PriorityQueue 和某个 k,并且你要返回该 PriorityQueue 中的第 k 个最小值。您还可以将 PriorityQueue 恢复到其初始状态,并可以使用一个堆栈或队列作为辅助数据结构。

我的更高层次的伪想法是,因为 PriorityQueue 已经充当了最小堆,从Java优先级队列 http://docs.oracle.com/javase/7/docs/api/java/util/PriorityQueue.html,我真正要做的(我的算法)是:

  1. 从 PriorityQueue 中删除 k 个元素

  2. 将第 k 个最小值存储为局部变量

  3. 将删除的 k 个元素推入堆栈(堆栈,以便我可以按相同顺序添加元素)

  4. 从 Stack 中弹出所有元素并将它们重新添加回 PriorityQueue

  5. 返回第 k 个最小值

这是完成所有这些操作的代码:

public int kthSmallest(PriorityQueue<Integer> pQ, int k) {
    if(k <= 0 || k > pQ.size()) {
           throw new IllegalArgumentException();
    } else {
         Stack<Integer> aux = new Stack<Integer>();
         int kThSmallest = -1;
         for(int c=0;c<k;c++){
               int element = pQ.remove();
               if(c == k-1) 
                   kThSmallest = element;
               aux.push(element);
          }
          while(!aux.isEmpty())
              pQ.add(aux.pop());
         return kThSmallest;
      }    
}

当我运行该程序时,我得到了所有正确的输出(就第 k 个最小而言),但我无法恢复 PriorityQueue 的状态。例如,当传入以下 PriorityQueue 时:

[-3, 9, 17, 22, 42, 81] with a k of 3

...我的算法产生了正确的结果 17,但它将 PriorityQueue 的状态更改为[-3, 17, 9, 81, 22, 42],这是意料之外的。

我考虑过制作 PriorityQueue 的副本,但这违反了一个条件,“您可以使用一个堆栈或队列作为辅助数据结构”。

我怎样才能恢复 PriorityQueue 的状态?


在您的实施中需要调整两件事。首先,您应该使用队列而不是堆栈作为辅助数据结构。将项目推入堆栈然后将其弹出将导致它们被添加回优先级队列中以相反的顺序。如果它们从优先级队列中出来1, 2, 3,它们将被添加回优先级队列3, 2, 1。这是因为堆栈是一种 LIFO(后进先出)数据结构。您想要使用队列作为辅助数据结构,因为它是 FIFO(先进先出)数据结构,因此它将保留相同的顺序。

其次,您只从优先级队列中取出前 k 个元素。我建议排空整个队列,以便将所有元素按照它们出现的顺序添加回队列,而不仅仅是一些元素。

换句话说,我会把你的程序调整如下:

public int kthSmallest(PriorityQueue<Integer> pQ, int k) {
    if(k <= 0 || k > pQ.size()) {
           throw new IllegalArgumentException();
    } else {
         Queue<Integer> aux = new ArrayDeque<Integer>();
         int kThSmallest = -1;
         for(int c=0;c<pQ.size();c++){
               Integer element = pQ.remove();
               if(c == k-1) 
                   kThSmallest = element;
               aux.add(element);
          }
          while(!aux.isEmpty())
              pQ.add(aux.remove());
         return kThSmallest;
      }
}

Note:我更改了程序中的“元素”变量的类型int to Integer。程序的正确性并不重要,但注意自动装箱是一个好习惯。通用类型,如集合,使用boxed整数。这是一个存储原始整数的对象。将装箱整数分配给某种类型int要求将其拆箱,即变回原样int原始。这不是什么大问题,只是您会立即再次将此值添加回集合中。既然你已经把它拆箱成一个原始的int,它需要装回一个Integer再次,这需要系统创建一个对象来存储它。由于您对值所做的只是将其从集合中取出并放回集合中,因此最好使用Integervalue 在这里,以避免拆箱和装箱该值,因为它并不是真正需要的。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何将 PriorityQueue 恢复到方法调用之前的初始状态? 的相关文章

  • Hibernate OneToMany 关系是 PersistentBag 而不是 List

    我正在 javafx 中开发一个应用程序 它通过 RMI 与 EAR 连接 该 EAR 连接到 SQLServer DB 并使用 hibernate 映射 POJOS 这些 POJOS 包含双向 OneToMany 和 ManyToOne
  • 在 Kotlin 中实现返回 Collection 的 Java 方法

    我将 Kotlin 与 Spring Security 结合使用 实现该方法时 public interface UserDetails extends Serializable Collection
  • 在气球内显示带有照片的多个地标的最佳做法是什么?

    我有一个项目如下 从手机上拍摄几张照片 将照片保存在网络系统中 然后将照片显示在其中的谷歌地球上 我读过很多文章 但它们都使用 fetchKml 我读过的一篇好文章是使用 php 但使用 fetchKml 我不知道是否可以使用 parseK
  • 删除 servlet 中的 cookie 时出现问题

    我尝试使用以下代码删除 servlet 中的 cookie Cookie minIdCookie null for Cookie c req getCookies if c getName equals iPlanetDirectoryPr
  • 如何在 OpenAPI 3.0 中定义字节数组

    我正在将 API 从 Swagger 2 0 迁移到 OpenAPI 3 0 在 DTO 中 我有一个指定为字节数组的字段 Swagger 对 DTO 的定义 Job type object properties body type str
  • Java:检查给定日期是否在当前月份内

    我需要检查给定的日期是否在当前月份 我编写了以下代码 但 IDE 提醒我getMonth https docs oracle com javase 7 docs api java util Date html getMonth and ge
  • 无法从后台服务通过 WiFi 访问互联网

    我将直接介绍我发现的一些事实 数据 如果您遇到 解决了类似的问题 请帮助我 我每 5 分钟向服务器发送一次数据 除非用户在服务器的帮助下手动将其关闭 wakeful broadcast receiver通过一个intent service
  • 如何消除警告:使用“$”而不是“.”对于 Eclipse 中的内部类

    我是 Android 开发新手 当我将 eclipse 和 Android SDK 更新到最新版本后 我收到警告 Use instead of for inner classes or use only lowercase letters
  • 如何模拟一个方面

    我目前正在使用aspectj 开发一些监控工具 因为这个工具应该是技术独立的 尽可能 所以我没有使用 Spring 进行注入 但我希望我的方面能够经过单元测试 方面示例 Aspect public class ClassLoadAspect
  • getClassLoader().getResource() 返回 null

    我有这个测试应用程序 import java applet import java awt import java net URL public class Test extends Applet public void init URL
  • 如何使用 Java 原生接口从 Java 调用 Go 函数?

    可以通过以下方式调用 C 方法JNA https en wikipedia org wiki Java Native AccessJava 中的接口 如何使用 Go 实现相同的功能 package main import fmt impor
  • .class 与 .java

    class 文件和 java 文件有什么区别 我正在尝试让我的小程序工作 但目前我只能在 Eclipse 中运行它 还不能嵌入 HTML 谢谢 编辑 那么如何使用 JVM 进行编译呢 class 文件是编译后的 java 文件 java 都
  • 使用外部硬盘写入和存储 mysql 数据库

    我已经设置了 mysql 数据库在我的 Mac 上使用 java 和 eclipse 运行 它运行得很好 但现在我将生成大约 43 亿行数据 这将占用大约 64GB 的数据 我存储了大量的密钥和加密值 我有一个 1TB 外部我想用作存储位置
  • 字节码和位码有什么区别[重复]

    这个问题在这里已经有答案了 可能的重复 LLVM 和 java 字节码有什么区别 https stackoverflow com questions 454720 what are the differences between llvm
  • 如何计算文件中单词的长度?爪哇

    我正在尝试编写一个代码来计算文件中特定长度的单词数 例如 How are you 会打印 Proportion of 3 letter words 100 3 words 我想计算长度为 1 2 3 4 5 6 7 8 9 10 11 12
  • Android 中的字符串加密

    我正在使用代码进行加密和加密 它没有给出字符串结果 字节数组未转换为字符串 我几乎尝试了所有方法将字节数组转换为字符 但没有给出结果 public class EncryptionTest extends Activity EditText
  • Java SE + Spring Data + Hibernate

    我正在尝试使用 Spring Data Hibernate 启动 Java SE 应用程序 并且到目前为止已经完成了以下操作 配置文件 Configuration PropertySource classpath hibernate pro
  • 日期时间解析异常

    解析日期时 我的代码中不断出现异常错误 日期看起来像这样 Wed May 21 00 00 00 EDT 2008 这是尝试读取它的代码 DateTimeFormatter formatter DateTimeFormatter ofPat
  • 使用 Android 的 Mobile Vision API 扫描二维码

    我跟着这个tutorial http code tutsplus com tutorials reading qr codes using the mobile vision api cms 24680关于如何构建可以扫描二维码的 Andr
  • Java 9 中紧凑字符串和压缩字符串的区别

    有什么优点紧凑的字符串 http openjdk java net jeps 254JDK9 中的压缩字符串 压缩字符串 Java 6 和紧凑字符串 Java 9 都有相同的动机 字符串通常实际上是 Latin 1 因此浪费了一半的空间 和

随机推荐

  • Gradle 将工件部署到本地目录内的 Maven 存储库

    Gradle 与 Maven 的等价物是什么
  • 如何允许Java程序一次只运行一个实例?

    我需要防止用户多次启动我的 Java 应用程序 WebStart Swing 应用程序 因此 如果应用程序已经在运行 则不应再次启动它或显示警告 再次关闭 有没有一些方便的方法来实现这一目标 我考虑过阻止端口或将某些内容写入文件 但希望您可
  • EntityFramework 如何覆盖属性

    我刚刚开始在 VS2010 中使用 EF 那东西真是太神奇了 坦白说我有些不明白 例如 我有带有属性的 EntityType 它们是从数据库结构生成的 现在 我只需在代码中重写该属性 我不需要将属性的值保存回数据库 但每次从数据库读取它时
  • 在 React 中渲染 Three.js 元素?

    我正在尝试制作一个渲染 Three js 场景的 React 组件 但是 每当我尝试安装组件而不是看到正在渲染的任何类型的场景时 我只看到文本 object HTMLCanvasElement 正在显示 这是我的组件 import Reac
  • 获取DLL函数的内存地址

    我想知道是否有可能 使用 C 和 WindowsAPI 是否有一个函数可以让我获得 dll 中函数的 32 位 我认为 内存地址 例如 如何获取 kernel32 dll 中 Beep 的 32 位 xxxxxxxx 地址 其次 如果我在汇
  • Symfony2:在实体类中获取 security.context

    是否可以得到security context在实体类中 我知道以下不起作用 我不知道如何实施 user part Set createdAt ORM PrePersist public function setCreatedAt user
  • 使用 Pyparse 解析多个项目并将其分组在一起

    这是建立在构建一个简单的解析器 能够使用 PyParse 解析不同的日期格式 https stackoverflow com questions 28113532 build a simple parser that is able to
  • 如何检测元素是否已滚动但仅滚动一次?

    我正在尝试检测某个元素是否已滚出并完成了以下代码 window bind scroll function var btn intro div summary a href top if window scrollTop gt btn off
  • Sqlite - 降级时

    最近我更新了我的android游戏 编辑sqlite数据库在我的表中添加新字段 更新后 我收到4个崩溃报告 其中3个来自同一设备 三星Galaxy S4 android database sqlite SQLiteException 无法降
  • JQuery 对话框在关闭时冻结

    termSheetPrinted dialog autoOpen false resizable true height 800 width 950 position center title Term Sheet close functi
  • 在 Spark SQL 中将结构转换为映射

    我正在尝试转换一个数据集 该数据集声明一列具有特定的struct类型 例如struct
  • React 中的 Map 函数(错误:TypeError:e.map 不是函数)

    我想从道具渲染项目 我可以使用初始状态来完成 但不能使用服务器的响应来完成 我的渲染函数 const data this props return div data map item index gt div span item id sp
  • 修复颠覆中犯下的错误

    这似乎是人们可能想要用颠覆做的最基本的事情之一 但我使用版本控制系统的时间并不长 不知怎的 我似乎无法弄清楚这一点 而且我不知道在哪里svn文档看看 基本上 修订版 167 工作得很好 但我犯了一个错误 并将其提交为修订版 168 而且我不
  • 无法在 mac osx 上的 QT 中创建新项目

    过去几天我一直坚持这个问题 我已经安装了 QT 4 8 并且也安装了库 但是当我开始创建一个新项目时 我只能选择使用 CMake 创建一个普通的 C 项目 我没有使用自动 qmake 的选项 我不知道为什么 如果有人可以帮忙 我们将不胜感激
  • Haskell 中的 Futamura 投影的证明

    我读了 Dan Piponi 的优秀博客文章二村博士的三个投影 http blog sigfpe com 2009 05 three projections of doctor futamura html 在文章的最后 他有一个附录 其中包
  • 使用实体管理器时,没有为该名称定义查询

    我有以下实体 package com server models Entity Table name users NamedQueries NamedQuery name User QUERY FIND USER query SELECT
  • 如何使用 PyQt5 在 QWidget 上设置 numpy 数组图像

    我正在将相机中的图像作为 numpy 数组读取 我的目标是将其放入 pyqt5 的 Qwidget 中并在我的 mainwindow gui 程序上打印 但我收到以下错误 TypeError QPixmap argument 1 has u
  • Font Awesome 图标不能用作链接

    我的字体很棒的图标没有链接到我在 a 标签上设置 href 的位置 事实上 当我检查它们时 a 标签上没有 href 我有一些演示代码供您查看 但是在演示代码中 它在检查时确实显示了 href 只是没有链接到页面 也许如果修复了此代码 它就
  • 如何使用 SparkR 计算数据框每列的缺失值数量?

    我正在处理一个 2 5 GB 的 csv 文件 其中包含 110 万行和 1000 个似乎稀疏的数字列 我目前在具有 8 GB RAM 的 1 核 VM 上执行 Spark 数据已分为 16 个分区 我尝试了类似以下的方法 但需要很长时间
  • 如何将 PriorityQueue 恢复到方法调用之前的初始状态?

    我正在做一道练习题 这个问题基本上是你传入一个 PriorityQueue 和某个 k 并且你要返回该 PriorityQueue 中的第 k 个最小值 您还可以将 PriorityQueue 恢复到其初始状态 并可以使用一个堆栈或队列作为