Определить количество промежутков монотонности в массиве и переставить местами первый и последний из них - C#
Формулировка задачи:
Дан массив размера N. Определить количество его промежутков монотонности и переставить местами первый и последний из них.
Пожалуйста, помогите с перестановкой элементов.
{ class Program { static void Main(string[] args) { // Вводим N int N; do { Console.Write("Размер массива (N) = "); // N должна быть не менее двух } while ((N = Convert.ToInt32(Console.ReadLine())) < 2); // Заполняем массив случайными числами Random rnd = new Random(); int i; int[] arr = new int[N]; for (i = 0; i < N; i++) { arr[i] = rnd.Next(100); // Сразу же выводим массив Console.Write(arr[i].ToString() + ' '); } Console.WriteLine(); // Счетчик int cntr = 0; // Флаг состояния: // 1 - убывание // 2 - возрастание // 0 - отсутствие изменений int flag = 0; for (i = 1; i < N; i++) { if (arr[i] < arr[i - 1]) { if (flag != 1) cntr++; flag = 1; } else if (arr[i] > arr[i - 1]) { if (flag != 2) cntr++; flag = 2; } else if (flag != 0) { cntr++; flag = 0; } } // Выводим результат: Console.WriteLine("Количество участков монотонности: " + cntr.ToString()); Console.ReadLine(); } } }
Решение задачи: «Определить количество промежутков монотонности в массиве и переставить местами первый и последний из них»
textual
Листинг программы
namespace ConsoleApplication1 { class Program { static void Main(string[] args) { // Вводим N int N; do { Console.Write("Размер массива (N) = "); // N должна быть не менее двух } while ((N = Convert.ToInt32(Console.ReadLine())) < 2); // Заполняем массив случайными числами Random rnd = new Random(); int i; int[] arr = new int[N]; for (i = 0; i < arr.Length; i++) { arr[i] = rnd.Next(100); // Сразу же выводим массив Console.Write(arr[i].ToString() + ' '); } Console.WriteLine(); var segments = new List<MonotoneSegment>(); segments.Add(new MonotoneSegment(0, 1, GetMonotoneKind(arr[0], arr[1]))); for (i = 1; i < arr.Length - 1; i++) { var s = segments.Last(); var m = GetMonotoneKind(arr[i], arr[i + 1]); if (s.MonotoneKind == m) { segments[segments.Count - 1] = new MonotoneSegment(s.Start, i + 1, s.MonotoneKind); } else { segments.Add(new MonotoneSegment(i, i + 1, m)); } } Console.WriteLine("Количество участков монотонности: " + segments.Count.ToString()); segments.ForEach(seg => Console.WriteLine(seg.ToString())); int[] arr2 = new int[arr.Length]; MonotoneSegment first = segments[0], last = segments.Last(); //Обмен сегментов местами. Array.Copy(arr, first.End + 1, arr2, first.Start + last.Length, last.Start - first.End - 1); Array.Copy(arr, last.Start, arr2, first.Start, last.Length); Array.Copy(arr, first.Start, arr2, first.Start + last.Length + last.Start - first.End - 1, first.Length); // Выводим результат: Console.WriteLine(string.Join(", ", arr)); Console.WriteLine(string.Join(", ", arr2)); Console.ReadLine(); } //Определение монотонности private static MonotoneKindEnum GetMonotoneKind(int a, int b) { if (a > b) { return MonotoneKindEnum.Descending; } return a < b ? MonotoneKindEnum.Ascending : MonotoneKindEnum.Neutral; } struct MonotoneSegment { /// <summary> /// Начало сегмента /// </summary> public int Start { get; private set; } /// <summary> /// Конец сегмента /// </summary> public int End { get; private set; } /// <summary> /// Длина сегмента /// </summary> public int Length => End - Start + 1; /// <summary> /// Тип сегмента /// </summary> public MonotoneKindEnum MonotoneKind { get; private set; } public MonotoneSegment(int start, int end, MonotoneKindEnum monotoneKind) { Start = start; End = end; MonotoneKind = monotoneKind; } public override string ToString() { return String.Format("Start = {0}; End={1}; MonotoneKind = {2}", Start, End, MonotoneKind); } } } internal enum MonotoneKindEnum { /// <summary> /// Отсутствие изменений /// </summary> Neutral = 0, /// <summary> /// Убывание /// </summary> Descending = 1, /// <summary> /// Возрастание /// </summary> Ascending = 2 } }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д