数组越界异常,约瑟夫斯



我似乎不明白为什么一直出现这个错误!这是我第一次处理排队问题。我确信解决方案很简单,我可能遗漏了一些基本的东西。非常感谢任何指导/帮助:

import java.util.LinkedList;
import java.util.Queue;

public class Josephus{
  public static void main(String[] args)
    {
        int n = Integer.parseInt(args[0]),
            m = Integer.parseInt(args[1]);
        Queue<Integer> q = new LinkedList<Integer>();
    for (int i = 0; i < n; i++)
        q.remove(new Integer(i));
    int k = 0;
    while (!q.isEmpty())
    {
        int x = q.remove();
        if (++k % m == 0)
            System.out.print(x + " ");
        else
            q.remove(x);
    System.out.println(x + " ");
    }
    }
}

此代码的原始提示如下:约瑟夫斯问题。在自古以来的约瑟夫斯问题中,N人处于水深火热之中,并同意以下减少人口的策略。他们把自己排成一个圆圈(在编号从0到N-1的位置),然后绕着这个圆圈前进,消灭每M个人,直到只剩下一个人。传说约瑟夫斯想好了坐在哪里以避免被淘汰。编写一个队列客户端Josephus,从命令行中获取N和M,并打印出人员被排除的顺序(从而向Josephus显示圆圈中的位置)。

您调用程序的方式不对。。。如果使用命令行,则必须提供参数:

java Josephus 5 6

否则,如果使用Eclipse(例如),则必须转到Run as、Run configurations,并在Program arguments字段中添加一些参数。您还可以用手动键入的值替换第一行:

int n = 10, m = 5;

我用随机的(m,n)值集运行它,它运行时没有任何错误(然而,它没有打印任何内容)。

您有:

Queue<Integer> q = new LinkedList<Integer>();
for (int i = 0; i < n; i++)
    q.remove(new Integer(i));

为什么要从新建(空)队列中删除项目?请尝试添加它们!

q.add(new Integer(i));

Java认为您正试图在while循环下的if语句的else语句中调用remove(int index),因为您正在传递一个int。作为一种变通方法,请完全按照在for循环中所做的操作。

q.remove(new Integer(x));

此外,您需要确保用户在命令行中输入了正确的参数。

if (args.length != 2){
    System.out.println("Invalid arguments.");
    return;
}
int n = Integer.parseInt(args[0]),
    m = Integer.parseInt(args[1]);

当您尝试访问不存在的数组元素时,将发生数组越界异常。

检查

args.length>=2,然后尝试访问此数组的前2个元素。

相关内容

  • 没有找到相关文章

最新更新