我正在尝试获取队列中的值。 解释问题: 票务过程中,一个人可以一次购买一张票,如果他想购买更多票,他必须回到队列中。我已经实现了它,但只要它发生变化就会堆栈以跟踪一个值。 我有一个队列[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);
没有给出正确的结果。我猜,我可以使用地图来跟踪它,但我感到很困惑。提前感谢您的指导。 如果我不清楚,请告诉我。
答案 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
时,迭代停止。