import java.util.LinkedList;
import java.util.Queue;
import java.util.Scanner;
public class forA1 {
public static void main(String[] args) throws Exception{
Scanner sc = new Scanner(System.in);
String []num = sc.nextLine().split(" ");
int n = Integer.parseInt(num[0]);
int m = Integer.parseInt(num[1]);
while(n != 0){
// initialize the queue
Queue<Integer> queue = new LinkedList<Integer>();
queue.clear();
for (int i = 1; i <= n; i++)
queue.add(i);
//int res = 0;
while (!queue.isEmpty()) {
for (int i = 0; i < m-1; i++)
queue.add(queue.remove());
queue.remove();
}
//System.out.println(res);
//System.out.println(res);
System.out.print(queue);
String []num2 = sc.nextLine().split(" ");
n = Integer.parseInt(num2[0]);
m = Integer.parseInt(num2[1]);
}
}
}
当我输入2个数字时,它会打印出来[]。请问一下我为什么会这样,我是学生,所以如果我问的是对其他人来说很容易的问题,我表示歉意。
答案 0 :(得分:1)
不确定您要对队列做什么,但是由于您有条件while (!queue.isEmpty())
,无论您在循环内做什么(除非您有某种 break
逻辑,多亏@Andy的评论)您将永远不会离开它(即无限循环),或者在它之后得到一个空队列。
如果从
更改 while (!queue.isEmpty()) {
for (int i = 0; i < m-1; i++)
queue.add(queue.remove());
queue.remove();
}
到
for (int i = 0; i < m-1; i++)
queue.add(queue.remove());
queue.remove();
您将能够看到一些非空的输出(给定适当的m
和n
值)。
答案 1 :(得分:0)
首先,由于您没有递减'n'的值,所以这是一个无限循环,到目前为止已提供了正确的输入。 “ n”和“ m”的值:-
while(n != 0){
...
// lines of code
String []num2 = sc.nextLine().split(" ");
n = Integer.parseInt(num2[0]);
m = Integer.parseInt(num2[1]);
}
第二,对于您的问题-“ 当我插入2个数字时,它会打印出[]。请问一些可以向我解释为什么会发生这种情况?””实际上,您已经编写了一段代码在您的程序中如下所示:-
while (!queue.isEmpty()) {
for (int i = 0; i < m-1; i++)
queue.add(queue.remove());
queue.remove();
}
此代码块的最后2行(恰好在关闭大括号之前)对队列产生反作用。它将使您的队列为空(您可以通过在while循环之前和之后放置-“ System.out.println(queue);
”来检查队列,通过这样做可以更清楚地理解)。结果,您将在控制台窗口中获得“ []”作为输出,该输出为空Queue!
PS:-在Java中,无论何时我们希望了解程序流程的地方,我们总是使用“ System.out.println();
”进行调试。