Как найти середину массива java

Given an array of integers, I need to return a new array containing the middle element(s) from the original array. Specifically, the result will have one element if the length of the original array is odd, and two elements if it’s even.

This is my code right now, which works for arrays of even length. How do I make it work for arrays with odd length?

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

APerson's user avatar

APerson

8,0488 gold badges35 silver badges49 bronze badges

asked Aug 3, 2015 at 1:37

user5183901's user avatar

3

int mid = firstIndex + (lastIndex-firstIndex)/2 , will give you the mid of the array.

Deepu's user avatar

Deepu

11.8k15 gold badges58 silver badges90 bronze badges

answered Mar 27, 2017 at 8:25

Shashikant Sharma's user avatar

3

start + (end - start) / 2 is prefered over (start + end) / 2. In case of using (start + end) / 2 and the summation result of start + end is larger than the integer max value, this will cause overflow.

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

answered Dec 22, 2020 at 21:21

Ryan's user avatar

RyanRyan

1822 silver badges4 bronze badges

1

Try this code:

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

In your original code, you were not checking whether the length of nums be even or odd.

answered Aug 3, 2015 at 1:52

Tim Biegeleisen's user avatar

Tim BiegeleisenTim Biegeleisen

497k25 gold badges279 silver badges355 bronze badges

0

A slightly general solution:

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;

}

Test run:

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

}

Output:

[2, 3]
[2]
[1, 2]
[1]

answered May 28, 2017 at 14:28

Bijay Gurung's user avatar

Bijay GurungBijay Gurung

1,0948 silver badges12 bronze badges

I was going through Java Array docs and found that. It is perfect solution to get mid of an array.

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

answered Apr 6, 2019 at 10:26

Kunal Vohra's user avatar

Kunal VohraKunal Vohra

2,6772 gold badges14 silver badges33 bronze badges

Maybe this will help you

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]));

answered Apr 26, 2022 at 13:45

Rami Almofleh's user avatar

I’ve seen:

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

The above works for any start index and any end index. It even checks that invalid inputs were not passed it. The book Cracking The Coding Interview uses this approach throughout the book in the various relevant problems

answered Apr 19, 2019 at 13:42

Jose Quijada's user avatar

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

answered Aug 16, 2019 at 19:17

Rares's user avatar

RaresRares

12 bronze badges

1

Try it like this:

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

MWiesner's user avatar

MWiesner

8,85811 gold badges36 silver badges70 bronze badges

answered Mar 16, 2022 at 16:01

sridhar's user avatar

1

Учитывая массив целых чисел, мне нужно вернуть новый массив, содержащий средний элемент из исходного массива. В частности, результат будет иметь один элемент, если длина исходного массива нечетна и два элемента, если они равны.

Это мой код прямо сейчас, который работает для массивов четной длины. Как заставить его работать с массивами с нечетной длиной?

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

03 авг. 2015, в 04:12

Поделиться

Источник

6 ответов

int mid = firstIndex + (lastIndex-firstIndex)/2, даст вам середину массива.

Shashikant Sharma
27 март 2017, в 09:09

Поделиться

Попробуйте этот код:

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 четной или нечетной.

Tim Biegeleisen
03 авг. 2015, в 03:50

Поделиться

Несколько общее решение:

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]

Bijay Gurung
28 май 2017, в 15:54

Поделиться

Я просматривал документы Java Array и нашел это. Это идеальное решение, чтобы получить середину массива.

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

Kunal Vohra
06 апр. 2019, в 11:43

Поделиться

Я видел:

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 используется этот подход на протяжении всей книги в различных актуальных задачах.

Jose Quijada
19 апр. 2019, в 14:28

Поделиться

Вы можете сделать это легко без функции:

if ((arr.length() % 2) == 0) {
    int[] newArr = new int[2];
    newArr[0] = arr.length()/2 - 1; //
    newArr[1] = arr.lenght()/2;
    return newArr;
} else {
    int[] newArr = new int[1];
    newArr[0] = arr.length/2;
    return newArr;
}

Gox
11 апр. 2019, в 23:25

Поделиться

Ещё вопросы

  • 0Texbox ограничивает символы и символы и допускает только числовые значения только с одной десятичной точкой
  • 0Как удалить тег IMG из HTML
  • 0как прекратить действия с помощью JavaScript
  • 1Как исключить класс в TestNG
  • 1невозможно получить контур правильно
  • 0О выравнивании данных конкретной структуры
  • 0Выравнивание текста по вертикали внутри ссылки внутри <li>, который должен расширяться по горизонтали
  • 1Java, сравните маленький 2D массив с каждой возможной итерацией в большем 2D массиве
  • 1сортировка по дате в базе данных Firebase
  • 0Можно ли при создании таблицы объявлять несколько столбцов одного типа без повторного упоминания типа?
  • 0PHP взорваться, сохранить «остатки»
  • 0Установка MySQL в Red Hat Linux с использованием замазки SSH
  • 1Схема <[объект объекта]> уже существует с другим определением
  • 1Вставка строк с первичным ключом / внешним ключом с использованием Hibernate
  • 1создание символической ссылки для strings.xml в папке значений
  • 0Ошибка Angular.js: Дубликаты в повторителе не допускаются — Отслеживание по индексу не работает
  • 0Файл блокировки Windows C ++ в памяти
  • 1Проблемы с установкой opencv в Docker-контейнере с помощью pip
  • 1Почему начальное значение «я» всегда 49
  • 1Почему рисовать штриховые линии на холсте не работает?
  • 0MySQL — Почему в этом случае вторичный индекс не сокращает время этого запроса?
  • 1Котлин — Наследование в выражении объекта
  • 1Как заставить entrySet () показывать пары ключ-значение на новой строке? (Java)
  • 0Как выровнять мои изображения по вертикали с помощью текстов
  • 0Как выбрать, где внешний ключ не существует в других столбцах, и сравнить даты из таблиц, которые не связаны напрямую
  • 1Re.search в регулярных выражениях Python не работает, как задумано
  • 0тип документа не допускает здесь элемент «BR»; при условии отсутствия стартового тега «LI»
  • 1Зависимость Android ‘com.android.support:support-core-utils’ имеет разные версии для компиляции (27.1.1) и времени выполнения (28.0.0)
  • 1получение данных из firebase и создание списка с помощью флажка
  • 1Запускать программу, только если ввод состоит из одной буквы
  • 1Определить точку столкновения двух объектов
  • 1Пользовательская сериализация gemfire не помогает
  • 1Запись данных маркера об изменении (Google maps API)
  • 1Установить ACL на функцию Lambda Python MediaConvert
  • 0Перетаскивание по требованию. Как включить, запустить и продолжить перетаскивание всего в одном событии mousedown?
  • 0проверка размера массива символов c ++
  • 0Передача массива из JQuery в PHP через POST
  • 0Могу ли я создать объект в том же классе?
  • 1В чем разница между возвратом Обещания с .then () и без .then ()?
  • 0Как отправить список элементов с помощью ajax и jquery и как извлечь данные из него в сценарии perl, чтобы его можно было добавить в базу данных
  • 0Как обновить переменную $ _SESSION с повторением $ _POST
  • 1Обнаружение сбоя соединения RMI при обратном вызове
  • 0Angular Chart.js не отображает диаграмму (отображается легенда)
  • 0как удалить кнопки «одна страница», «две страницы»… «шесть страниц» в printpreviewdialog?
  • 0Угловой модуль отложенной реализации
  • 0Ссылаясь на корневой каталог
  • 1Как уменьшить / изменить задержку после сканирования?
  • 1LinqToSql — SQL, сгенерированный CONCAT (UNION)
  • 1Moq — Как шагнуть в реальный метод?
  • 1Моя программа зачетных книжек не печатает должным образом, чтобы превзойти документ

Сообщество Overcoder

I’m writing a function that tries to find the middle of a 2d array, and here’s what I have so far:

int findMiddle(int[][] grid,int [] m) {
    int[] list = new int[grid.length*grid[0].length];
    int listPos = 0;
    for(int i = 0 ; i < grid.length; i++) {
        for(int j = 0; j < grid.length; j++) {
            list[listPos++] = grid[i][j];
        }
    }
    int middle = m.length/2;
    if (m.length%2 == 1) {
        return m[middle];
    } else {
        return (m[middle-1] + m[middle]) / 2.0;
    }
}

Suppose I have an array of

{{0, 1, 2, 3},
 {4, 5, 6, 7},
 {8, 9, 0, 1}}

It should return 6, as it is integer division.
Also, the definition of middle in this code is the middle integer of the whole original array (needless to say if it is sorted or not).

How would I do this? ( my code also doesn’t compile)

В принципе для решения такой задачи использование Arrays.copyOfRange не обязательно, так как длина результирующего массива не превышает 2.

Также @Serodv правильно заметил, что для массивов малой длины (1 или 2) следует скопировать их содержимое, а не просто возвращать входной массив.

Дополнительно можно воспользоваться vararg синтаксисом для передачи массива:

public static int[] getMiddle(int ... arr) {
    if (null == arr || arr.length < 1) {
        return arr;
    }
    int mid = arr.length / 2 + arr.length % 2 - 1;
    return arr.length % 2 == 0 ? new int[]{arr[mid], arr[mid + 1]} : new int[]{arr[mid]};
}

Аналогично вариант с System.arraycopy:

public static int[] getMiddle2(int ... arr) {
    if (null == arr || arr.length < 1) {
        return arr;
    }
    int[] res = new int[2 - arr.length % 2];
    System.arraycopy(arr, arr.length / 2 + arr.length % 2 - 1, res, 0, res.length);
    return res;
}

Вариант с Arrays.copyOfRange:

public static int[] getMiddle3(int ... arr) {
    if (null == arr || arr.length < 1) {
        return arr;
    }

    int start = arr.length / 2 + arr.length % 2 - 1;
    int end = start + 2 - arr.length % 2;
    return Arrays.copyOfRange(arr, start, end);
}

Найти средний элемент связанного списка

1. обзор

В этом руководстве мы объясним, как найти средний элемент связанного списка в Java.

В следующих разделах мы представим основные проблемы и покажем различные подходы к их решению.

2. Отслеживание размера

Эту проблему легко решить с помощьюkeeping track of the size when we add new elements to the list. Если мы знаем размер, мы также знаем, где находится средний элемент, поэтому решение тривиально.

Давайте посмотрим на пример реализацииLinkedList в Java:

public static Optional findMiddleElementLinkedList(
  LinkedList linkedList) {
    if (linkedList == null || linkedList.isEmpty()) {
        return Optional.empty();
    }

    return Optional.of(linkedList.get(
      (linkedList.size() - 1) / 2));
}

Если мы проверим внутренний код классаLinkedList, то увидим, что в этом примере мы просто просматриваем список, пока не дойдем до среднего элемента:

Node node(int index) {
    if (index < (size >> 1)) {
        Node x = first;
        for (int i = 0; i < index; i++) {
            x = x.next;
        }
        return x;
    } else {
        Node x = last;
        for (int i = size - 1; i > index; i--) {
            x = x.prev;
        }
        return x;
    }
}

3. Найти середину, не зная размера

Очень часто мы сталкиваемся с проблемами, когдаwe only have the head node of a linked list, и нам нужно найти средний элемент. В этом случае мы не знаем размер списка, что усложняет решение этой проблемы.

В следующих разделах мы покажем несколько подходов к решению этой проблемы, но сначала нам нужно создать класс, представляющий узел списка.

Давайте создадим классNode, в котором хранятся значенияString:

public static class Node {

    private Node next;
    private String data;

    // constructors/getters/setters

    public boolean hasNext() {
        return next != null;
    }

    public void setNext(Node next) {
        this.next = next;
    }

    public String toString() {
        return this.data;
    }
}

Кроме того, мы будем использовать этот вспомогательный метод в наших тестовых примерах, чтобы создать односвязный список, используя только наши узлы:

private static Node createNodesList(int n) {
    Node head = new Node("1");
    Node current = head;

    for (int i = 2; i <= n; i++) {
        Node newNode = new Node(String.valueOf(i));
        current.setNext(newNode);
        current = newNode;
    }

    return head;
}

3.1. Определение размера в первую очередь

Самый простой подход для решения этой проблемы — сначала найти размер списка, а затем следовать тому же подходу, который мы использовали ранее — итерировать до среднего элемента.

Давайте посмотрим на это решение в действии:

public static Optional findMiddleElementFromHead(Node head) {
    if (head == null) {
        return Optional.empty();
    }

    // calculate the size of the list
    Node current = head;
    int size = 1;
    while (current.hasNext()) {
        current = current.next();
        size++;
    }

    // iterate till the middle element
    current = head;
    for (int i = 0; i < (size - 1) / 2; i++) {
        current = current.next();
    }

    return Optional.of(current.data());
}

Как видим,this code iterates through the list twice. Therefore, this solution has a poor performance and it’s not recommended.

3.2. Итерационный поиск среднего элемента за один проход

Теперь мы собираемся улучшить предыдущее решение, найдя средний элемент всего за одну итерацию по списку.

Чтобы сделать это итеративно, нам нужно два указателя, чтобы перебирать список одновременно. One pointer will advance 2 nodes in each iteration, and the other pointer will advance only one node per iteration.

Когда более быстрый указатель достигает конца списка, более медленный указатель будет в середине:

public static Optional findMiddleElementFromHead1PassIteratively(Node head) {
    if (head == null) {
        return Optional.empty();
    }

    Node slowPointer = head;
    Node fastPointer = head;

    while (fastPointer.hasNext() && fastPointer.next().hasNext()) {
        fastPointer = fastPointer.next().next();
        slowPointer = slowPointer.next();
    }

    return Optional.ofNullable(slowPointer.data());
}

Мы можем проверить это решение с помощью простого модульного теста, используя списки с нечетным и четным числом элементов:

@Test
public void whenFindingMiddleFromHead1PassIteratively_thenMiddleFound() {

    assertEquals("3", MiddleElementLookup
      .findMiddleElementFromHead1PassIteratively(
        createNodesList(5)).get());
    assertEquals("2", MiddleElementLookup
      .findMiddleElementFromHead1PassIteratively(
        reateNodesList(4)).get());
}

3.3. Рекурсивный поиск среднего элемента за один проход

Другой способ решить эту проблему за один проход — использовать рекурсию. Мы можем выполнить итерацию до конца списка, чтобы узнать размер иin the callbacks, we just count until the half of the size.

Чтобы сделать это в Java, мы собираемся создать вспомогательный класс, чтобы сохранять ссылки размера списка и среднего элемента во время выполнения всех рекурсивных вызовов:

private static class MiddleAuxRecursion {
    Node middle;
    int length = 0;
}

Теперь давайте реализуем рекурсивный метод:

private static void findMiddleRecursively(
  Node node, MiddleAuxRecursion middleAux) {
    if (node == null) {
        // reached the end
        middleAux.length = middleAux.length / 2;
        return;
    }
    middleAux.length++;
    findMiddleRecursively(node.next(), middleAux);

    if (middleAux.length == 0) {
        // found the middle
        middleAux.middle = node;
    }

    middleAux.length--;
}

И наконец, давайте создадим метод, вызывающий рекурсивный:

public static Optional findMiddleElementFromHead1PassRecursively(Node head) {

    if (head == null) {
        return Optional.empty();
    }

    MiddleAuxRecursion middleAux = new MiddleAuxRecursion();
    findMiddleRecursively(head, middleAux);
    return Optional.of(middleAux.middle.data());
}

Опять же, мы можем проверить это так же, как и раньше:

@Test
public void whenFindingMiddleFromHead1PassRecursively_thenMiddleFound() {
    assertEquals("3", MiddleElementLookup
      .findMiddleElementFromHead1PassRecursively(
        createNodesList(5)).get());
    assertEquals("2", MiddleElementLookup
      .findMiddleElementFromHead1PassRecursively(
        createNodesList(4)).get());
}

4. Заключение

В этой статье мы представили проблему поиска среднего элемента связного списка в Java и показали различные способы ее решения.

Мы начали с простейшего подхода, при котором отслеживали размер, а затем продолжили поиск решений по поиску среднего элемента в головном узле списка.

Как всегда, доступен полный исходный код примеровover on GitHub.

Понравилась статья? Поделить с друзьями:
  • Как найти постановления суда по лишению прав
  • Как найти делители числа калькулятор
  • Как найти человека в программе жду тебя
  • Как найти человека живущего в другой стране
  • Как составить список аптечки