public class LuckyMan {

public static void main(String args[]){
int a[] = {1,2,3,4,5,6,7,8,9,10};
start(a);
}

public static void start(int a[]){
int n = a.length;

if(n == 1){
System.out.println("幸运人士为:" + a[0]);
}else{

for(int i=0; i<n-1; i++){         //将奇号位置为0
if(i % 2 == 0){
a[i] = 0;
}
}

int newN = n / 2;                //新数组长度为原数组长度的一半

if(n>1){                         //将原数组非0元素复制到新数组中
int temp[] = new int[newN];  
int j = 0;

for(int i=0; i<n; i++){
if(a[i] != 0){
temp[j] = a[i];        
j++;
}
}
start(temp);
}
}
}
}

解决方案 »

  1.   

    非0元素多于n/2就会溢出哦
    应该先判断一次非0元素有多少个,以便精确地为temp[]申请长度
      

  2.   

    for(int i=0; i<n-1; i++){ //改成i<n否则你倒数第二个奇数没被置0,数组分一半的时候,就多了个不为0的元素,所以就越界了
      

  3.   


    for(int i=0; i<n-1; i++){ //将奇号位置为0
    if(i % 2 == 0){
    a[i] = 0;
    }
    }正如楼上所说的 这个for循环 i < n - 1 改成 i < n 
      

  4.   

    答案如楼上所说,我就举个例子解释一下:假如是9(1-9)个元素,由于是 i < n-1,就是i不能是8
    使用第一次循环的结果为:
    0 2 0 4 0 6 0 8 9int newN = 9 / 2=4;第二个循环的时候,i < n ,就是可以遍历所有的9个元素,可以看到有5个元素不为0,而新的数长度只有4,所以会溢出