跟踪队列中的值更改 - java

时间:2017-10-01 16:24:15

标签: java data-structures queue

我正在尝试获取队列中的值。 解释问题: 票务过程中,一个人可以一次购买一张票,如果他想购买更多票,他必须回到队列中。我已经实现了它,但只要它发生变化就会堆栈以跟踪一个值。 我有一个队列[6,1,3,5,2],我必须跟踪位置= 4的值,即队列中的值5。所以我删除了值并减少它并再次添加回队列直到它变为零。 我想知道4号位的值何时变为零,如果我遵循相同的过程。我试过了

int[] arr = {6,1,3,5,2};
int position =5;
Map<Integer,Integer> m = new HashMap<>();
Queue<Integer> q = new LinkedList<>();
for(int i=0; i<arr.length; i++){
    q.add(arr[i]);
    m.put(i,arr[i]);
}
//int s =q.size();
System.out.println("queue = "+q );
int count=0;
int z = m.get(p-1);
int v = p-1;
while(z>=0){
int e = q.remove();
if(e!=0){
    count++;
e--;
q.add(e);
}
int s=q.size();
if(count==v){
    v=v+s;
    z--;
}
}
System.out.println("result = "+ count);

没有给出正确的结果。我猜,我可以使用地图来跟踪它,但我感到很困惑。提前感谢您的指导。 如果我不清楚,请告诉我。

1 个答案:

答案 0 :(得分:0)

如果我理解正确的话,你有一个数组代表队列中每个人想要获得的票数,你想确定你跟踪的那个人(人)要等多少才能得到所有他想要的门票。

如果是这种情况,您可以确定使用如下简单的内容:

public static void main(String[] args) {
    int[] arr = {6,1,3,5,2};
    int position = 5;
    int times = arr[position - 1];
    int count = 0;
    for(int i = 0; i < (times * arr.length); i++){
        if(arr[i % arr.length] != 0){
            arr[i % arr.length] = arr[i % arr.length] - 1;
            count++;
        }
    }
    System.out.println("Count: " + count);
}

这不是那么有效,因为它总是循环整个数组的长度,即使有些人已经获得了他们所有的门票,但它肯定更容易理解。

以下是使用队列减少迭代次数的示例:

public class A {

    public static void main(String[] args) {
        int[] arr = {6,1,3,5,2};
        int position = 5;
        Queue<Person> queue = new LinkedList<Person>();
        for (int i = 0; i < arr.length; i++) {
            queue.add(new Person(i+1, arr[i]));
        }
        int count = 0;
        while(true){
            Person p = queue.remove();
            p.tickets--;
            count++;
            if(p.tickets == 0){
                if(p.position == position){
                    break;
                }
            }else{
                queue.add(p);
            }
        }
        System.out.println("Count: " + count);
    }

    static class Person{
        int position;
        int tickets;

        public Person(int position, int tickets){
            this.position = position;
            this.tickets = tickets;
        }
    }       
}

这样做是为了创建一个人队列并循环遍历该队列,直到被跟踪的人获得其所有队列。在每次迭代时,队列前面的人员将从队列中删除,并且只有在他仍需要获得票证person.ticket != 0时才会被添加回来。当被跟踪者获得所有票证person.position == position && person.tickets == 0时,迭代停止。