Определить количество промежутков монотонности в массиве и переставить местами первый и последний из них - C#

Узнай цену своей работы

Формулировка задачи:

Дан массив размера N. Определить количество его промежутков монотонности и переставить местами первый и последний из них. Пожалуйста, помогите с перестановкой элементов.
Листинг программы
  1. {
  2. class Program
  3. {
  4. static void Main(string[] args)
  5. {
  6. // Вводим N
  7. int N;
  8. do
  9. {
  10. Console.Write("Размер массива (N) = "); // N должна быть не менее двух
  11. }
  12. while ((N = Convert.ToInt32(Console.ReadLine())) < 2);
  13. // Заполняем массив случайными числами
  14. Random rnd = new Random();
  15. int i;
  16. int[] arr = new int[N];
  17. for (i = 0; i < N; i++)
  18. {
  19. arr[i] = rnd.Next(100);
  20. // Сразу же выводим массив
  21. Console.Write(arr[i].ToString() + ' ');
  22. }
  23. Console.WriteLine();
  24. // Счетчик
  25. int cntr = 0;
  26. // Флаг состояния:
  27. // 1 - убывание
  28. // 2 - возрастание
  29. // 0 - отсутствие изменений
  30. int flag = 0;
  31. for (i = 1; i < N; i++)
  32. {
  33. if (arr[i] < arr[i - 1])
  34. {
  35. if (flag != 1) cntr++;
  36. flag = 1;
  37. }
  38. else if (arr[i] > arr[i - 1])
  39. {
  40. if (flag != 2) cntr++;
  41. flag = 2;
  42. }
  43. else if (flag != 0)
  44. {
  45. cntr++;
  46. flag = 0;
  47. }
  48. }
  49. // Выводим результат:
  50. Console.WriteLine("Количество участков монотонности: " + cntr.ToString());
  51. Console.ReadLine();
  52. }
  53. }
  54. }

Решение задачи: «Определить количество промежутков монотонности в массиве и переставить местами первый и последний из них»

textual
Листинг программы
  1. namespace ConsoleApplication1
  2. {
  3.     class Program
  4.     {
  5.         static void Main(string[] args)
  6.         {
  7.             // Вводим N
  8.             int N;
  9.             do
  10.             {
  11.  
  12.                 Console.Write("Размер массива (N) = "); // N должна быть не менее двух
  13.             }
  14.  
  15.             while ((N = Convert.ToInt32(Console.ReadLine())) < 2);
  16.             // Заполняем массив случайными числами
  17.             Random rnd = new Random();
  18.             int i;
  19.             int[] arr = new int[N];
  20.             for (i = 0; i < arr.Length; i++)
  21.             {
  22.                 arr[i] = rnd.Next(100);
  23.                 // Сразу же выводим массив
  24.                 Console.Write(arr[i].ToString() + ' ');
  25.             }
  26.             Console.WriteLine();
  27.             var segments = new List<MonotoneSegment>();
  28.  
  29.             segments.Add(new MonotoneSegment(0, 1, GetMonotoneKind(arr[0], arr[1])));
  30.             for (i = 1; i < arr.Length - 1; i++)
  31.             {
  32.                 var s = segments.Last();
  33.                 var m = GetMonotoneKind(arr[i], arr[i + 1]);
  34.                 if (s.MonotoneKind == m)
  35.                 {
  36.                     segments[segments.Count - 1] = new MonotoneSegment(s.Start, i + 1, s.MonotoneKind);
  37.                 }
  38.                 else
  39.                 {
  40.                     segments.Add(new MonotoneSegment(i, i + 1, m));
  41.                 }
  42.             }
  43.             Console.WriteLine("Количество участков монотонности: " + segments.Count.ToString());
  44.             segments.ForEach(seg => Console.WriteLine(seg.ToString()));
  45.             int[] arr2 = new int[arr.Length];
  46.             MonotoneSegment first = segments[0], last = segments.Last();
  47.             //Обмен сегментов местами.
  48.             Array.Copy(arr, first.End + 1, arr2, first.Start + last.Length, last.Start - first.End - 1);
  49.             Array.Copy(arr, last.Start, arr2, first.Start, last.Length);
  50.             Array.Copy(arr, first.Start, arr2, first.Start + last.Length + last.Start - first.End - 1, first.Length);
  51.  
  52.             // Выводим результат:
  53.             Console.WriteLine(string.Join(", ", arr));
  54.             Console.WriteLine(string.Join(", ", arr2));
  55.  
  56.             Console.ReadLine();
  57.         }
  58.         //Определение монотонности
  59.         private static MonotoneKindEnum GetMonotoneKind(int a, int b)
  60.         {
  61.             if (a > b)
  62.             {
  63.                 return MonotoneKindEnum.Descending;
  64.             }
  65.             return a < b ? MonotoneKindEnum.Ascending : MonotoneKindEnum.Neutral;
  66.         }
  67.  
  68.         struct MonotoneSegment
  69.         {
  70.             /// <summary>
  71.             /// Начало сегмента
  72.             /// </summary>
  73.             public int Start { get; private set; }
  74.             /// <summary>
  75.             /// Конец сегмента
  76.             /// </summary>
  77.             public int End { get; private set; }
  78.             /// <summary>
  79.             /// Длина сегмента
  80.             /// </summary>
  81.             public int Length => End - Start + 1;
  82.             /// <summary>
  83.             /// Тип сегмента
  84.             /// </summary>
  85.             public MonotoneKindEnum MonotoneKind { get; private set; }
  86.  
  87.             public MonotoneSegment(int start, int end, MonotoneKindEnum monotoneKind)
  88.             {
  89.                 Start = start;
  90.                 End = end;
  91.                 MonotoneKind = monotoneKind;
  92.             }
  93.  
  94.             public override string ToString()
  95.             {
  96.                 return String.Format("Start = {0}; End={1}; MonotoneKind = {2}", Start, End, MonotoneKind);
  97.             }
  98.         }
  99.     }
  100.  
  101.     internal enum MonotoneKindEnum
  102.     {
  103.         /// <summary>
  104.         /// Отсутствие изменений
  105.         /// </summary>
  106.         Neutral = 0,
  107.         /// <summary>
  108.         /// Убывание
  109.         /// </summary>
  110.         Descending = 1,
  111.         /// <summary>
  112.         /// Возрастание
  113.         /// </summary>
  114.         Ascending = 2
  115.     }
  116. }

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

10   голосов , оценка 4.2 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы