用Java实现数三退一的算法中一些问题
mip版 关注:287 答案:2 悬赏:30
解决时间 2021-01-25 05:44
已解决
2021-01-24 12:19
这是一个算法,请各位看看错的为什么错了,小弟感激不尽!
正确的:
public class Count3Quit {
public static void main(String[] args) {
boolean[] arr = new boolean[500];
for(int i=0; i
arr[i] = true;
}
int leftCount = arr.length;
int countNum = 0;
int index = 0;
while(leftCount > 1) {
if(arr[index] == true) {
countNum ++;
if(countNum == 3) {
countNum = 0;
arr[index] = false;
leftCount --;
}
}
index ++;
if(index == arr.length) {
index = 0;
}
}
for(int i=0; i
if(arr[i] == true) {
System.out.println(i);
}
}
}
}
错误的:
public class MyCount3Quit {
public static void main(String[] args) {
boolean[] array = new boolean[3]; //创建Boolean类型的数组array,长度为500;
for(int i = 0; i
array[i] = true;
//System.out.println(array[i]);
}
int length = array.length; //定义length的长度等于array的长度;
int index =0;
int count =0; //定义下标值index,和用于数数的Count;
while(length>1) { //当length的长度大于1时执行while语句
if(array[index] == true) {
count++; //每次循环过来Count的值加一;
if(count==3) { //如果下标在逻辑上等于3了,
array[index] = false; //array[index]的值改为FALSE;
count = 0; //count归零;
length--; //数到3一次,数组长度就减一;
}
}
if(index==array.length) { //当下标值等于和数组的长度减一相等了,下标值从零开始
index = 0;
}
index++; //每循环一次,代表数组下标的index的值加一;
}
for(int i = 0; i < array.length; i++) { //用for语句打印出array[i]为TRUE的数字;
if(array[i] == true) {
System.out.println(i);
}
}
}
}
最佳答案
2021-01-24 13:04
原本很简单啊!
首先可以看出楼主的数组长度是3,而写的注释是500(虽然这是允许的)
其次就是错误的关键了:看下面一段楼主的程序
if(index==array.length) { //当下标值等于和数组的长度减一相等了,下标值从零开始
index = 0;
}
index++; //每循环一次,代表数组下标的index的值加一;
而我们可以发现原来正确的程序代码并不是这样的,请看:
index ++;
if(index == arr.length) {
index = 0;
}
}
发现问题了没有啊!关键问提就在这里啊: 这两部分执行的顺序是相反的,那么结果大相径庭,到至后面的程序无法正常运行!原因很简单,对于上面的代码(正确运行那一种)可以判断 index 的取值范围是:[0,arr.length-1],所以不会发生数组越界异常。而且可以根据index坐下表扫面完整个数组。
再看不能正确运行的代码:index的取值范围是[1,arr.length],那么当index达到ary.length以后,就永远无法在访问arr[0],因为当index达到ary.length以后,下面的操作
if(index==array.length) {
index = 0;
}
index++;
会让index为1。arr[0]无法在访问,而且还会有数组越界异常,index=arr.length时发生数组越界。所以程序不能正常运行。
这下明白了吧?细节决定成败就体现在这里了。
全部回答
1楼
2021-01-24 13:25
数组越界异常
我要举报
如果感觉以上信息为低俗/不良/侵权的信息,可以点下面链接进行举报,我们会做出相应处理,感谢你的支持!
点此我要举报以上信息!
推荐资讯
大家都在看