Как вывести массив в обратном порядке c
Перейти к содержимому

Как вывести массив в обратном порядке c

  • автор:

Инверсия порядка элементов в массиве

Дан массив размера N. Поменять порядок его элементов на обратный.

Как надо решить? Как начать?

Nicolas Chabanovsky's user avatar

самый простой вариант — воспользоватся встроеной функцией реверса:

второй — написать реверс самому:

Самый простой и эффективный вариант этого алгоритма (назависимо от C#, C, Pascal, Java, Basic . ) в цикле менять значения первого с последним, второго с предпоследним и т.д.

Как вывести массив в обратном порядке c

Все массивы в C# построены на основе класса Array из пространства имен System. Этот класс определяет ряд свойств и методов, которые мы можем использовать при работе с массивами. Основные свойства и методы:

Свойство Length возвращает длину массива

Свойство Rank возвращает размерность массива

int BinarySearch (Array array, object? value) выполняет бинарный поиск в отсортированном массиве и возвращает индекс найденного элемента

void Clear (Array array) очищает массив, устанавливая для всех его элементов значение по умолчанию

void Copy (Array sourceArray, int sourceIndex, Array destinationArray, int destinationIndex, int length) копирует из массива sourceArray начиная с индекс sourceIndex length элементов в массив destinationArray начиная с индекса destinationIndex

bool Exists<T> (T[] array, Predicate<T> match) проверяет, содержит ли массив array элементы, которые удовлеворяют условию делегата match

void Fill<T> (T[] array, T value) заполняет массив array значением value

T? Find<T> (T[] array, Predicate<T> match) находит первый элемент, который удовлеворяет определенному условию из делегата match. Если элемент не найден, то возвращается null

T? FindLast<T> (T[] array, Predicate<T> match) находит последний элемент, который удовлеворяет определенному условию из делегата match. Если элемент не найден, то возвращается null

int FindIndex<T> (T[] array, Predicate<T> match) возвращает индекс первого вхождения элемента, который удовлеворяет определенному условию делегата match

int FindLastIndex<T> (T[] array, Predicate<T> match) возвращает индекс последнего вхождения элемента, который удовлеворяет определенному условию

T[] FindAll<T> (T[] array, Predicate<T> match) возвращает все элементы в виде массива, которые удовлеворяет определенному условию из делегата match

int IndexOf (Array array, object? value) возвращает индекс первого вхождения элемента в массив

int LastIndexOf (Array array, object? value) возвращает индекс последнего вхождения элемента в массив

void Resize<T> (ref T[]? array, int newSize) изменяет размер одномерного массива

void Reverse (Array array) располагает элементы массива в обратном порядке

void Sort (Array array) сортирует элементы одномерного массива

Разберем самые используемые методы.

Поиск индекса элемента

Если элемент не найден в массиве, то методы возвращают -1.

Поиск элемента по условию

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

Например, изменим порядок элементов:

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

В данном случае изменяем порядок только 3 элементов начиная c индекса 1.

Изменение размера массива

Для изменения размера массива применяется метод Resize. Его первый параметр — изменяемый массив, а второй параметр — количество элементов, которые должны быть в массиве. Если второй параметр меньше длины массива, то массив усекается. Если значение параметра, наоборот, больше, то массив дополняется дополнительными элементами, которые имеют значение по умолчанию. Причем первый параметр передается по ссылке:

Копирование массива

Метод Copy копирует часть одного массива в другой:

В данном случае копируем 3 элемента из массива people начиная c индекса 1 и вставляем их в массив employees начиная с индекса 0.

Сортировка массива

Отсортируем массив с помощью метода Sort() :

Этот метод имеет много перегрузок. Например, одна из версий позволяет отсортировать только часть массива:

How to reverse an array in C#

Get Educative’s popular interview prep course for free.

The Array class in the System namespace provides the Reverse() method used to reverse the elements of an array with multiple overloads.

Syntax

  • This method works only for single dimensional Arrays and throws a RankException if the array passed as input is multi-dimensional.
  • It throws a ArgumentNullException if the input array is null.
  • The Reverse() method does not use an auxiliary array for reversal and overwrite the existing elements of the array.
  • The time complexity of Array.Reverse() method is O(n) , where n is the number of elements in the array.

In the example below, we have created and initialized an Array with integers. We then print the Array elements before calling the Reverse() method.

We then call the Reverse() method and print the Array contents again. The array elements are now reversed, so the program prints the following output.

Обратный массив без использования Array.Reverse ()

Как изменить массив (на С#) без использования метода Array.Reverse() ?

должно привести к

Я получил это как интервью.

19 ответов

Вместо слова // some code here в вопросе стоит заменить следующий код:

Вы должны выполнять итерацию только через первую половину массива ( arr.Length / 2 ). Если вы выполните итерацию по всему массиву ( arr.Length ), он будет дважды изменен, что даст тот же порядок элементов, что и до его начала.

В принципе, вас попросят переопределить Array.Reverse(Array) . Если вы посмотрите, как реализован в самой структуре и игнорирует многие технические детали, вы обнаружите, что он просто вызывает трехпараметрическую версию (который меняет указанную часть массива) на весь массив.

Array.Reverse(Array,Int32,Int32) — это цикл while, который свопирует элементы и поддерживает два индекса:

  • i указывает на первый элемент обращенной части и
  • j указывает на последний элемент обращенной части.

Переписано вместо // some code here вместо вопроса <<24 > :

Это легче понять, чем реализация с использованием for-loop, делает меньше арифметических и элегантно уклоняется от gotcha с двойной реверсией.

То есть цикл So Simple Start из Array legth и так далее, смотрите код, и вы поймете :)))

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

Но я не могу понять, почему вы преследуете такой бесполезный квест, если это что-то произвело на кого-то кого-то, а затем использовать вместо циклов for:)

Ну, очевидно, вы можете просто скопировать в новый массив в обратном порядке.

Чтобы выполнить операцию «на месте», вы можете работать с обоих концов по направлению к середине: загрузите первый и последний элементы, затем сохраните их, первый в последнее место и последний в первое место. Затем выполните второй и следующий-последний и т.д. Если у вас есть четное число элементов, вы выполняете N/2 итерации. Если вы выполняете нечетное число (N-1)/2 итерации и оставляете средний элемент там, где он был.

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

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *