我正在尝试在未排序的堆栈中找到多数或领导者,并且我遇到了问题(堆栈变量顶部)。下面是我的主要包含的代码。数组或堆栈的大部分是在数组中出现超过一半时间的任何元素(arrSize / 2)。
leader 5
tos 8
after function tos -1
-1
问题出现在leader和isLeader方法中,在初始调用isLeader之后,tos返回为tos = -1,如下面的输出所示。
输出:
SUMIFS
我的意图是在每次调用isLeader()之后如果返回false,我想从顶部弹出tos变量并再次使用新的较小堆栈调用isLeader()。
真的很感激任何帮助,我希望每个人都很好!
谢谢
答案 0 :(得分:1)
我个人向你的public Integer leader()
添加方法ArrayStack
,如果堆栈没有领导者,则返回堆栈的领导者或null
:
public Integer leader() {
final Map<Integer, Integer> counts = new HashMap<>();
final int neededLeaderCount = ((tos + 1) / 2) + 1;
for (int i = 0; i <= tos; ++i) {
int currentElementCount = counts.getOrDefault(stackArr[i], 0) + 1;
if (currentElementCount >= neededLeaderCount) {
return stackArr[i];
}
counts.put(stackArr[i], currentElementCount);
}
return null;
}
然后可以将isLeader
函数重写为:
public static boolean isLeader(ArrayStack myStack, int leader) {
// use Objects.equals as myStack.leader() may be null
return Objects.equals(myStack.leader(), leader);
}
这种方法更加清晰,因为它不会修改或要求ArrayStack
在课堂外部的任何内部。
答案 1 :(得分:0)
我能够通过跟踪堆栈的currSize传递给isLeader函数来使其工作。我觉得我复杂的事情,如果有人有一个更简单的解决方案,并希望分享它,我会乐于接受它。如果有人有兴趣,下面是我的代码。
public static int leader(ArrayStack myStack){
int currSize = myStack.tos;
int initSize = myStack.tos + 1; //gets initial size of stack.
int leader; //initialize leader or majority.
while(!myStack.isEmpty()){
leader = myStack.peek();//set first leader variable to the element at the tos.
System.out.println("leader " + leader); //just for debugging
System.out.println("tos " + myStack.tos); //debugging
//System.out.println(isLeader(myStack, initSize, leader)); //debugging
if(isLeader(myStack, initSize, leader, currSize)){
return 1;
}
else{
--currSize;
myStack.pop();
}
System.out.println("after function tos " + myStack.tos); //debugging
}
return -1;
}
public static boolean isLeader(ArrayStack myStack, int initSize, int leader, int currSize){
ArrayStack as = myStack;
int count = 0;
while(as.tos > -1){
if(as.peek() == leader){
--as.tos; //Just move tos pointer down stack rather than popping
//to maintain original stack.
++count;
}
else{
--as.tos;
}
}
if(count > initSize / 2)
return true;
else{
as.tos = currSize;//reset the tos pointer back to the currSize of
//stack.
return false;
}
}