.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();
}
}
}