我在做练习题练习IT
Kth最小
基本上,这个问题是您在PriorityQueue和某个k中传递的,并且要在那个PriorityQueue中返回第k个最小值。您还需要将PriorityQueue恢复为其初始状态,并且可以使用一个堆栈或队列作为辅助数据结构。
我的高级伪思维是,由于PriorityQueue已经充当了最小堆,因此从Java
PriorityQueue中
,我真正要做的(我的算法)是:
从PriorityQueue中删除k个元素
将第k个最小值存储为局部变量
将删除的k个元素推入堆栈(堆栈,以便我可以按相同顺序添加元素)
从堆栈中弹出所有元素,然后将它们重新添加到PriorityQueue中
返回第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的状态。例如,当传递以下优先级队列时:
[-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;
}
}
注意: 我将程序中的’element’变量从type
int
更改为Integer
。程序的正确性无关紧要,但是注意自动装箱是一个好习惯。通用类型(如集合)使用 装箱的
整数。这是一个存储原始整数的对象。将装箱的整数分配给某种类型的东西int
要求将其拆箱,即重新变成int
原始类型。这没什么大不了的,只不过您要立即将此值再次重新添加到集合中。由于您已将其拆箱为原始文件int
,因此需要将其重新装箱到Integer
再次,这需要系统创建一个对象来存储它。由于您所要做的就是将值取出并放回集合中,因此最好在Integer
此处使用一个值,以避免拆箱和装箱价值,因为它不是真正需要的。
我正在做一个练习题,练习它 这个问题基本上是在PriorityQueue和某个k中传递,然后返回该PriorityQueue中的第k个最小值。您还需要将PriorityQueue恢复到其初始状态,并可以使用一个堆栈或队列作为辅助数据结构。 我的更高层次的伪思想是,因为PriorityQueue已经充当了最小堆,从JavaPriorityQueue,我真正要做的(我的算法)是: > 从Priorit
问题内容: 我是自动化测试和dbUnit的新手。因此,感谢您的建议。 我将创建一个测试套件,它将以以下方式运行: 创建一个内存中的H2数据库 运行DDL脚本以创建表 运行dbUnit来插入将被所有测试使用的初始数据(我们称其为 STATE0 )。 运行测试 到那里对我来说看起来不错,但是我不明白,是在测试运行并更改数据后如何将数据库还原为 STATE0 ? 我可以使用dbUnit吗? 还是其他?
概述 Sublime Text 可以通过删除 data 文件夹的方式恢复到初始状态。不同操作系统这个文件夹的位置也不同: OS X:~/Library/Application Support/Sublime Text 3 Windows:%APPDATA%\Sublime Text 3 Linux:~/.config/sublime-text-3 恢复到初始状态,你需要: 退出 Sublime T
问题内容: 我很好奇,无论如何在init方法内部调用一个用于设置类实例属性的方法。本质上,我只是有一个类来对UIView进行子类化,并在init中添加了一些子视图,而其中一些子视图是该类的实例变量。 现在出现了问题,我无法在初始化类的内部属性之前调用super init(在super.init调用时未初始化属性’self.collectionView’),但是在调用之前,我也无法调用自定义方法来初
问题内容: 我正在使用ajax-solr。它与jquery-ui-1.8。*一起正常工作。 但是,当我将其升级到jquery-1.10。*时,出现了以下异常: 无法在初始化之前调用自动完成方法;尝试将方法称为“销毁” 问题答案: 我在自动完成小部件的初始化中得到了答案…只需添加 这将初始化发生的自动完成窗口小部件,因为在 1.10。*中 。jQuery在未正确初始化的情况下添加了错误消息以供使用功
我试图探索Android框架是如何管理碎片的,通过我的研究,我了解了很多关于碎片的新知识,但我有一次陷入了困境,无法理解这是如何发生的。 请先试着理解我的场景。它是这样的:我有一个活动,一个接一个地添加两个片段。首次加载活动时,使用以下代码将片段A附加到该活动: 片段A的这些回调方法在加载时被调用 FirstDummyFragment:onCreate:savedInstanceState---