Решение на задача от Глава 7 - Масиви във "Въведение в програмирането със C#"

Решение на задача от Глава 7 - Масиви във "Въведение в програмирането със C#"

BorisYordanov avatar BorisYordanov 1 Точки

Решение на задача от Глава 7 - Масиви във "Въведение в програмирането със C#"

Линк към главата

Имам въпрос за решението задача №4, с условие:

"4.      Напишете програма, която намира максимална редица от последова­телни еднакви елементи в масив. Пример: {2, 1, 1, 2, 3, 3, 2, 2, 2, 1} à {2, 2, 2}."

По-долу съм сложил и решение, което свалих от сайта.

Имам проблем със следната част от кода:

 for (int count = 0; count < arrayLength; count++)
            {
                int currentCount = 0;
                for (int minCount = count; minCount < arrayLength; minCount++)
                {
                    if (arrayOfNumbers[count] == arrayOfNumbers[minCount])

Очевидно е, че count и minCount винаги ще имат една и съща стойност, но идеята на задачата е програмата ни да сравнява един член от масива със следващия, т.е. да сравним елемент 0 с елемент 1, а след това елемент 1 с елемент 2. А в момента (доколкото разбирам сравняваме един и същ, понеже

arrayOfNumbers[0] == arrayOfNumbers[0])  

arrayOfNumbers[1] == arrayOfNumbers[1]) 

и т.н.

Но решението работи както трябва и е ясно, че аз нещо ме съм разбрал. Може ли някой да ми изясни как точно работи това решение?

using System;

class FindsTheMaximalSequence
{
    static void Main(string[] args)
    {
        string enterLength = Console.ReadLine();
        int arrayLength = int.Parse(enterLength);
        int[] arrayOfNumbers = new int[arrayLength];
        string enterString;
        for (int count = 0; count < arrayLength; count++)
        {
            enterString = Console.ReadLine();
            arrayOfNumbers[count] = int.Parse(enterString);
        }
        int maxCount = 0;
        int value = 0;
        for (int count = 0; count < arrayLength; count++)
        {
            int currentCount = 0;
            for (int minCount = count; minCount < arrayLength; minCount++)
            {
                if (arrayOfNumbers[count] == arrayOfNumbers[minCount])
                {
                    currentCount++;
                    if (maxCount < currentCount)
                    {
                        maxCount = currentCount;
                        value = arrayOfNumbers[count];
                    }
                }
                else
                {
                    break;
                }
            }
        }            
        Console.WriteLine("Max length = {0} and value is {1}", maxCount, value);                        
    }
}

 

Тагове:
KrasimirPetkov avatar KrasimirPetkov 331 Точки

Задачата може да се реши с един for-цикъл, който да обходи масива.

Необходимата информация, за извеждане на резултат е:

1. Най-големият брой еднакви елементи.

2. Началната им позиция в масива.

Това означава, че имаме нужда от две променливи: maxCount и maxStart.

За целта може да сравним последователно всеки елемент от масива с предходния, като началният индекс се съхранява в променлива currentStart, а броя на еднаквите елементи в currentCount. При всяка промяна на currentCount, сравняваме currentCount с maxCount и ако е по-голям, присвояваме стойностите към maxCount и maxStart. Ако елементът е различен от предходните, currentCount се връща в изходна позиция, а currentStart става еквивалентен на настоящия индекс.

int maxCount = 0;
int maxStart = 0;
int currentCount = 1;
int currentStart = 0;
for (int i = 1; i < array.Length; i++)
{
    if (array[i]==array[i-1])
    {
        currentCount++;
        if (currentCount > maxCount) { maxCount = currentCount; maxStart = currentStart; }
    }
    else
    {
        currentCount = 1;
        currentStart = i;
    }
}

Ето и линк към решението (масивът се въвежда на един ред, разделен с интервали):

http://pastebin.com/wPqkkyMw

PS: Използвал съм малко Linq, което не се учи в Programming Basics, но това е само с цел по-лесно въвеждане на изходните данни и извеждане на резултата. Можеш да го замениш с каквото намериш за удачно :)

1
23/05/2016 16:47:21
BorisYordanov avatar BorisYordanov 1 Точки

Твоето решение наистина е доста по-опростено. Благодаря

1