【问题标题】:sorting 0 and 1 in Java [duplicate]在Java中对0和1进行排序[重复]
【发布时间】:2019-03-13 09:13:24
【问题描述】:

无法找出代码中的问题 它说线程“main”中的异常 java.lang.ArrayIndexOutOfBoundsException: 6 我经历了很多次,仍然无法弄清楚是什么问题

注意:尝试对数组中的 0、1 进行排序

public class javaarray {

    public static void main(String[] args) {

        int[] arr = new int[]{1, 0, 0, 1, 1, 0}; 
        int left = 0, right =arr.length-1;
        while(left<right) {
            while(arr[left]==0 && left<right) {
                left++;
            }
            while(arr[right]==1 && left<right){
                right++;
            }
            if(left<right) {
                arr[left]=0;
                arr[right]=1;
                left++;
                right--;
              }  
           }

           for(int i=0; i<arr.length;i++) {
               System.out.print(arr[i]) 
           }
       }
    }

}

【问题讨论】:

  • 最高元素应该是5,因为它是从0开始的。您正在尝试访问 6,因此出现错误。
  • 在使用leftright 访问数组中的索引之前,您应该始终检查它们是否是有效索引。
  • 将 for 循环限制为数组长度为 1:for(int i=0; i

标签: java arrays sorting indexoutofboundsexception


【解决方案1】:

一种更有效的方法(仅对包含 0 和 1 的数组有效):

int[] arr = new int[]{1, 0, 0, 1, 1, 0};
int current = 0;
int total = 0;

while (current < arr.legth) {
    total += arr[current];
    current++;
}

current = 0;
int[] sortedArr = new int[arr.length];

while (current < sortedArr.legth) {
    if (current < sortedArr.legth - total) {
        sortedArr[current] = 0;
    } else {
        sortedArr[current] = 1;
    }
}

for (int i = 0; i < sortedArr.length; i++) {
    System.out.print(sortedArr[i]) 
}

【讨论】:

    【解决方案2】:

    如果它只是 0-1 数组,则应计算其中的 0 和 1,并在所有 0 之后打印所有 1:

        int[] arr = new int[]{1,0,0,1,1,0};
        int zerosCount = 0;
        for (int e: arr) {
            if (e == 0) {
                ++zerosCount;
            }
        }
        for (int i = 0; i < zerosCount; ++i) {
            System.out.print(0);
        }
        for (int i = zerosCount; i < arr.length; ++i) {
            System.out.print(1);
        }
    

    这种方法具有线性复杂性。

    【讨论】:

      【解决方案3】:

      这几行

      while(arr[right]==1 && left<right){
        right++;
      }
      

      应该是

      while(arr[right]==1 && left<right){
        right--;
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-01-14
        • 1970-01-01
        • 2018-09-03
        • 2017-02-09
        • 2014-12-26
        • 2016-10-14
        • 2013-08-28
        • 2010-10-21
        相关资源
        最近更新 更多