Определить количество промежутков монотонности в массиве и переставить местами первый и последний из них - 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
- }
- }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д