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

时间:2015-08-03 01:37:35

标签: java arrays

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

这是我现在的代码,适用于偶数长度的数组。如何使它适用于奇数长度的数组?

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;
}

8 个答案:

答案 0 :(得分:11)

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

答案 1 :(得分: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的长度是偶数还是奇数。

答案 2 :(得分:2)

略微通用的解决方案:

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]

答案 3 :(得分:1)

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

@override
Widget build(BuildContext context) {
  return WillPopScope(
    onWillPop: () => Future.value(false), // disabling back press
    child: Scaffold(
      appBar: AppBar(title: Text("Back button")),
      body: Center(
        child: Column(
          children: <Widget>[
            RaisedButton(onPressed: () => Navigator.of(context).pop), // won't allow back press
            RaisedButton(onPressed: () => Navigator.pop(context)), // allows back press
          ],
        ),
      ),
    ),
  );
}

答案 4 :(得分:1)

element.all(by.css('.items li')).filter(function(elem, index) { return elem.getText().then(function(text) { return text === 'Third'; }); 优于 start + (end - start) / 2 。如果使用(start + end) / 2,start+end的求和结果大于整数最大值,会导致溢出。

(start + end) / 2

答案 5 :(得分: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书在本书的各个相关问题中都采用了这种方法

答案 6 :(得分:0)

import org.apache.spark.sql.Row

val irm = new IndexedRowMatrix(transformed.rdd.map {
  Row(_, v: org.apache.spark.ml.linalg.Vector) => 
    org.apache.spark.mllib.linalg.Vectors.fromML(v)
}.zipWithIndex.map { case (v, i) => IndexedRow(i, v) })



<console>:5: error: not a legal formal parameter.
Note: Tuples cannot be directly destructured in method or function parameters.
      Either create a single parameter accepting the Tuple1,
      or consider a pattern matching anonymous function: `{ case (param1, param1) => ... }
  Row(_, v: org.apache.spark.ml.linalg.Vector) =>
     ^

答案 7 :(得分:0)

   int arr[] = {10, 11, 12, 13, 15, 18, 20};
    int num = (arr.length) / 2;
    if (num % 2 == 0) {
        for (int i = (num - 1); i <= num; i++) {
            System.out.println(arr[i]);
        }
    } else {

        System.out.println(arr[num]);

    }