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

 

Тагове:
0
Programming Basics
KrasimirPetkov avatar KrasimirPetkov 328 Точки

Задачата може да се реши с един 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
Можем ли да използваме бисквитки?
Ние използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Можете да се съгласите с всички или част от тях.
Назад
Функционални
Използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Използваме „сесийни“ бисквитки, за да Ви идентифицираме временно. Те се пазят само по време на активната употреба на услугите ни. След излизане от приложението, затваряне на браузъра или мобилното устройство, данните се трият. Използваме бисквитки, за да предоставим опцията „Запомни Ме“, която Ви позволява да използвате нашите услуги без да предоставяте потребителско име и парола. Допълнително е възможно да използваме бисквитки за да съхраняваме различни малки настройки, като избор на езика, позиции на менюта и персонализирано съдържание. Използваме бисквитки и за измерване на маркетинговите ни усилия.
Рекламни
Използваме бисквитки, за да измерваме маркетинг ефективността ни, броене на посещения, както и за проследяването дали дадено електронно писмо е било отворено.