首页 > 解决方案 > Java数组/逆新手

问题描述

我是 java 语言的新手,我有一个必须解决的问题,我很确定我做对了,但测试仪仍然崩溃。

如果必须做的事情的简要总结是“在数组 a 中,反转是数组中同时满足 i < j 和 a[i] > a[j] 的一对位置 i 和 j。在组合学中,数组内的反转计数是该数组“乱序”的粗略衡量。如果数组按升序排序,则它的反转数为零,而以相反顺序排序的 n 元素数组具有 n(n-1 )/2 反转,可能的最大数量。此方法应计算给定数组 arr 内的反转,并返回该计数“

这是我所做/尝试过的


import java.util.Arrays;

public class P2J1
{
public static int countInversions(int[] arr)
{ 
    int inversions = 0; 
    for (int i = 0; i <= arr.length; i++){
        for (int j = i+1; j < i; j++){
           if (arr[i] > arr[j]){
               inversions++; 
           } 
       } 
   } 
  return inversions; 
} 
}

/// here's the tester 

    @Test public void testCountInversions() {
        Random rng = new Random(SEED);
        CRC32 check = new CRC32();
        for(int i = 0; i < 1000; i++) {
            int[] a = new int[i];
            for(int j = 0; j < i; j++) {
                a[j] = rng.nextInt(100000);
            }
            check.update(P2J1.countInversions(a));
        }
        assertEquals(1579619806L, check.getValue());
    }

标签: javaarraysinversion

解决方案


在 Java 中,数组索引是从0arr.length - 1,您需要i <= arr.length在代码中更改为i < arr.length。否则你会得到ArrayIndexOutofBoundsException

@khelwood 的建议也是正确的。更改(int j = i+1; j < i; j++)(int j = i+1; j < arr.length; j++)


推荐阅读