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

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


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

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

10   голосов , оценка 4.2 из 5
Похожие ответы