在Java中查找数组的中间元素

14

给定一个整数数组,我需要返回一个新的数组,其中包含原始数组的中间元素。 如果原始数组长度为奇数,则结果将有一个元素,如果原始数组长度为偶数,则结果将有两个元素。

这是我的代码,目前适用于长度为偶数的数组。 如何使其适用于长度为奇数的数组?

public int[] makeMiddle(int[] nums) {
    int[] a = new int[2];
    if(nums.length>1) {
        a[1]=nums[nums.length/2];
        a[0]=nums[nums.length/2-1];
        return a;
    } else {
        a[2]=nums[((nums.length+1)/2) -1];
    }
    return a;
}

2
查找数组的中位数?Finding the median value of an array? 这个链接可以帮助你前进。 - Mick Mnemonic
对于奇数长度的数组,我需要中间的元素。例如:如果我有:a = {1,2,3,4,5},那么它的结果将是:{3}。问题在于我不知道如何建立一个通用的循环来获取正好位于中间的单个元素。 - user5183901
请查看下面给出的答案,谢谢。 - Tim Biegeleisen
9个回答

31

int mid = firstIndex + (lastIndex-firstIndex)/2会给你数组的中间值。


谢谢您,先生... :) - Prabjot Singh
3
或者说,int mid = (firstIndex + lastIndex)/2 - Dahn
1
舍入问题怎么办? - ekar

10

start + (end - start) / 2(start + end) / 2 更好。在使用 (start + end) / 2 的情况下,如果开始和结束的求和结果大于整数最大值,则会导致溢出。

public class MidOfArray {
    static final int start = Integer.MAX_VALUE;
    static final int end = Integer.MAX_VALUE;

    public static void doesnotWork() {
        int mid = (start + end) / 2;
        System.out.println(mid);    // output: -1
    }
    public static void worksGreat() {
        int mid = start + ((end + start) / 2);
        System.out.println(mid);    // output: 2147483646
    }
    public static void main(String[] args) {
        doesnotWork();
        worksGreat();
    }
}

1
worksGreat函数有问题 int mid = start + ((end - start) / 2); - nishil bhave

5
尝试这段代码:
public int[] makeMiddle(int[] nums) {
    int[] a;
    if (nums.length %2 == 0) {
        // even-length array (two middle elements)
        a = new int[2];
        a[0] = nums[(nums.length/2) - 1];
        a[1] = nums[nums.length/2];
    } else {
        // odd-length array (only one middle element)
        a = new int[1];
        a[0] = nums[nums.length/2];
    }
    return a;
}

在您的原始代码中,您没有检查nums的长度是偶数还是奇数。

1

我正在查看Java数组文档,发现这是获取数组中间值的完美解决方案。

int low = startIndexOfArray;      // 0 Normally but can be anything
int high = endIndexOfArray - 1;       

int mid = (low + high) >>> 1;
System.out.print("Mid Value OF Array Is "+ mid);

1
也许这会对你有所帮助。

const median = arr => {
  const mid = Math.floor(arr.length / 2),
    nums = [...arr].sort((a, b) => a - b);
  return arr.length % 2 !== 0 ? nums[mid] : (nums[mid - 1] + nums[mid]) / 2;
};
console.log(median([5, 6, 50, 1, -5]));
console.log(median([1, 2, 3, 4, 5]));


1
一个稍微通用的解决方案:

public static int[] midArray(int[] arr) {
    int extra = arr.length % 2 == 0? 1 : 0;

    int[] a = new int[1 + extra];

    int startIndex = arr.length / 2 - extra;
    int endIndex = arr.length / 2;

    for (int i = 0; i <= endIndex - startIndex; i++) {
        a[i] = arr[startIndex + i];
    }

    return a;

}

测试运行:

public static void main(String[] args) {
    int[] a = new int[]{1, 2, 3, 4};
    int[] b = new int[]{1, 2, 3};
    int[] c = new int[]{1, 2};
    int[] d = new int[]{1};

    System.out.println(Arrays.toString(midArray(a)));
    System.out.println(Arrays.toString(midArray(b)));
    System.out.println(Arrays.toString(midArray(c)));
    System.out.println(Arrays.toString(midArray(d)));

}

输出:
[2, 3]
[2]
[1, 2]
[1]

0

可以尝试这样做:

class MiddleArray {

    public static void main(String[] args) {
        int arr[] = {100, 14, 46, 47, 96, 94};
        int totalLength = arr.length / 2;
        System.out.println("Total Length of Array :" + arr.length + "\n");
        if (arr.length % 2 == 0) {
            System.out.println("Middle Element of array :" + arr[totalLength] + "  " + arr[totalLength - 1]);
        } else {
            System.out.println("Array Postion:" + arr[totalLength]);
        }
    }
}

你的回答可以通过提供更多支持信息来改进。请编辑以添加进一步的细节,例如引用或文档,以便他人可以确认你的答案是正确的。您可以在帮助中心找到有关如何编写良好答案的更多信息。 - Community

0

我看过:

Integer midElement(int[] ary, int start, int end) {
    if (start < end) {
        return null;
    }
    int mid = (start + end)/2;
    return ary[mid];

以上代码适用于任何start索引和任何end索引。它甚至检查了是否传递了无效的输入。书籍Cracking The Coding Interview在各种相关问题中都使用了这种方法。

0
public int[] makeMiddle(int[] nums) {


        if(nums.length>=2){

        if(nums[nums.length-1]%2==0) {  
          int[] arrEven=new int[2];
          arrEven[0]=nums[(nums.length/2)-1];
          arrEven[1]=nums[(nums.length/2)];
          return arrEven;                                                
         }
        else {              
            int[] arrOdd=new int[1];
            arrOdd[0]=nums[(nums.length/2)];                
            return arrOdd;
        }
        }
        return nums;
 }

1
恐怕这个答案只有在数组有偶数项的情况下才有效,因此只能回答原问题的一半。 - Vytautas Plečkaitis

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接