使用堆栈的数组实现查找Majority(leader)

时间:2017-10-06 18:25:14

标签: java arrays stack

我正在尝试在未排序的堆栈中找到多数或领导者,并且我遇到了问题(堆栈变量顶部)。下面是我的主要包含的代码。数组或堆栈的大部分是在数组中出现超过一半时间的任何元素(arrSize / 2)。

leader 5
tos 8
after function tos -1
-1

问题出现在leader和isLeader方法中,在初始调用isLeader之后,tos返回为tos = -1,如下面的输出所示。

输出:

SUMIFS

我的意图是在每次调用isLeader()之后如果返回false,我想从顶部弹出tos变量并再次使用新的较小堆栈调用isLeader()。

真的很感激任何帮助,我希望每个人都很好!

谢谢

2 个答案:

答案 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;
    }
}