.NET 2.x Найти наибольшую длину цепочки стоящих рядом знакочередующихся элементов и количество отрицательных - C#

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

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

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

Решение задачи: «.NET 2.x Найти наибольшую длину цепочки стоящих рядом знакочередующихся элементов и количество отрицательных»

textual
Листинг программы
using System;
using System.Collections.Generic;
 
namespace Task1
{
    class Program
    {
        static void Main(string[] args)
        {
            float[] elements =
            {
                0.1f, 0.3f, 9f,
                -45f, 5f, //------------------------------ Цепочка 1 (1 пара)
                7f, 0f, 3f, 6f, 7f, 7f, 8f, -89f, -76f,
                -12f, 67f, //----------------------------- Цепочка 2 (1 пара)
                87f, 65f,
                -34f, 5f, -6f, 7f, -31f, 54f, //---------- Цепочка 3 (3 пары подряд)
                12.45f, 67f, 5f,
                -24f, 4f, -2f, 3f, -3f, 4f, -5f, 3f, //--- Цепочка 4 (4 пары подряд)
                2f, 3f, 4f,
                -5f, 56f, -65f, 12f // ------------------- Цепочка 5 (2 пары подряд)
            };
 
            //Исходим из предположения, что цепочка всегда начинается с 
            //отрицательного числа и заканчивается положительным, если 
            //после этого положительного числа нет отрицательного, 
            //то цепочка обрывается.
 
            int quantityOfNegativeElements;
            FloatNumChain[] chains = GetChains(elements, out quantityOfNegativeElements);
            FloatNumChain greatest = null;
            int greatestLengthOfChain = 0;
            for (int i = 0; i < chains.Length; i++)
            {
                FloatNumChain chain = chains[i];
                if (chain.Chain.Length > greatestLengthOfChain)
                {
                    greatest = chain;
                    greatestLengthOfChain = greatest.Chain.Length;
                }
            }
 
            Console.WriteLine("Кол-во отрицательных элементов в массиве - " + quantityOfNegativeElements);
            if (greatest != null)
            {
                Console.WriteLine("Кол-во элементов самой длинной цепочки - " + greatest.Chain.Length);
                Console.WriteLine("Элементы первой самой длинной цепочки:");
                Array.ForEach(greatest.Chain, value => Console.Write("{0}; ", value));
            }
 
            Console.ReadKey();
        }
 
        static FloatNumChain[] GetChains(float[] elements, out int quantityOfNegativeElements)
        {
            quantityOfNegativeElements = 0;
            
            var chains = new List<FloatNumChain>();
            float prevValue = 0f;
            var currentChain = new List<float>(elements.Length);
 
            for (int i = 0; i < elements.Length; i++)
            {
                float element = elements[i];
                bool elementIsNegative = element < 0f;
                if (elementIsNegative)
                {
                    quantityOfNegativeElements++;
                }
                bool prevElementIsNegative = prevValue < 0f;
                bool continueToBuildChain = (elementIsNegative && !prevElementIsNegative) ||
                                            (!elementIsNegative && prevElementIsNegative);
 
                if (continueToBuildChain) //Если продолжать строить цепочку
                {
                    currentChain.Add(element);
                }
                else if (elementIsNegative)
                {
                    if (currentChain.Count > 0)
                    {
                        currentChain.Clear();
                    }
                    currentChain.Add(element);
                }
                else
                {
                    if (currentChain.Count == 0)
                    {
                        continue;
                    }
 
                    if (currentChain.Count % 2 != 0)
                    {
                        currentChain.Clear();
                        continue;
                    }
 
                    chains.Add(new FloatNumChain(currentChain.ToArray()));
                    currentChain.Clear();
                }
 
                prevValue = element;
            }
 
            if (currentChain.Count > 0 && currentChain.Count % 2 == 0)
            {
                chains.Add(new FloatNumChain(currentChain.ToArray()));
            }
            
            return chains.ToArray();
        }
    }
}

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


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

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

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