日期:2014-05-20  浏览次数:20775 次

求助~数3退1 循环数组实现运行出错,提示数组越界
public class Count3Quit3{
public static void main(String[] args){
int[] arr = new int[500];
for(int i=0;i<arr.length-1;i++){
arr[i] = i+1;
}
arr[arr.length-1] = 0;
int count = arr.length;
int countNum = 0;
int index = 0;
while(count>1){
countNum++;
if(countNum == 3){
countNum = 0;
arr[index-1] = arr[index];
count--;
}
index = arr[index];
}
//System.out.println(index);
}
}


------解决方案--------------------
楼主你要先学会贴代码:
public class A {
    private String name;
}

------解决方案--------------------
引用:
public class Count3Quit3{
public static void main(String[] args){
int[] arr = new int[500];
for(int i=0;i<arr.length-1;i++){
arr[i] = i+1;
}
arr[arr.length-1] = 0;
int count = arr.length;
int countNum = 0;
int index = 0;
while(count>1){
countNum++;
if(countNum == 3){
countNum = 0;
arr[index-1] = arr[index];
count--;
}
index = arr[index];
}
//System.out.println(index);
}
}



你的 arr[arr.length-1] = 0; 说明499下标的为0啊
然后你后面又arr[index-1] 出现了arr[-1]所以就报错了
------解决方案--------------------
因为前面有代码
引用
arr[arr.length-1] = 0;


而当index等于499时,arr[499]的值为0,这时index的值为0
引用
index = arr[index];


引用
arr[index-1] = arr[index];

进入这里时,index=0会出现arr[-1] = arr[0],所以报错了
------解决方案--------------------
首先用数组来实现这样做实在不太明智,因为数组的长度是固定的,而每去掉一个,数组的“长度”就要减一,最后直到只剩下一个为止。所以必须有一个“指针”指向最末尾的位置,每去掉一个这个指针就往前移一位。
/**
 * 翻牌-丢牌游戏,将一叠牌拿在手里,把最上面的牌翻到最下面,每翻若干次就
 * 丢掉一张最上面的牌,直到剩下最后一张牌。
 */
public class CountAndDelete {

    public static final int ARRAY_SIZE = 500;         // 初始牌数

    public static final int MOVE_DISTANCE = 3;      // 每次翻牌的数量

    public static void main(String[] args) {
        int finalElement = countAndDelete(ARRAY_SIZE, MOVE_DISTANCE);
        System.out.println("Final element: " + finalElement);
    }

    private static int countAndDelete(int arraySize, int moveDistance) {
        int[] arr = new int[arraySize];
        fillArray(arr);

        int bound = arraySize - 1;  // 最后剩余元素的位置
        int counter = 0;            // 总是指向最上面的牌

        while (bound > 0) {
            counter = moveCounter(counter, moveDistance, bound);
            deleteElement(arr, counter, bound);
            bound--;
        }

        return arr[0];
    }

    // 删除当前位置的数组元素,将后面的元素往前移
    private static void deleteElement(int[] arr, int position, int bound) {
        System.out.println("Delete: " + arr[position]);