[C#] Max sequence of equal elements in an array?


0

Здравейте,

Подкарал съм слайдовете от минали години подред, но за мен материята и нещата са съвсем нови и се затрудних на следната задача:

6. Write a program that finds the maximal sequence of equal elements in an array.

  Example: {2, 1, 1, 2, 3, 3, 2, 2, 2, 1} -->  {2, 2, 2}.

Направих нещо, което не ме изкара на прав път и не зная дали и как мога да го оправя, но усещането ми е, че хем е излишно засукано, хем не върши работа в крайна сметка и не води до еднозначно решение.

Какви са вашите идеи? Ще се радвам да споделите решения, ако имате.

Ето аз какво "скопосах".: http://pastebin.com/vLautMJc

 






Отговори



3

 

Аз се сещам за нещо може би по-простичко като идея, за което няма да е нужен вложен цикъл :) Ето го и него:
Ще ти трябват 2 допълнителни променливи - първата ще съхранява най-голямата поредица числа, до съответния момент на обхождане, 
а втората ще ти е нужна за да претърсваш масива за по-голяма поредица (нека първата променлива бъде maxSeqSize, а втората например  tempSeqSize). На maxSeqSize може да зададеш стойност по подразбиране 1, защото в най-лошия случай, в масива няма да има нито една двойка съседни еднакви елементи :)
На tempSeqSize също може да зададеш 1ца.
 
Идеята ми е, при обхождането на масива да проверяваш всеки един елемент, дали е еднакъв със следващия:
ако да - tempSeqSize ++
ако не - правиш проверка дали tempSeqSize > maxSeqSize 
    отново ако да - maxSeqSize = tempSeqSize
 
 
 

от Simeon1024 (70 точки)


0
и tempSeqSize = 1;

от nikola76 (1250 точки)


1
Здравей,
тръгнал си добре, но както казва Симеон, въртешния цикъл не е наред. На тебе ти трябва последователност от еднакви елементи. И съответно коя е най - дългата последователност. Значи ти трябва да знаеш досега от какви елементи е последователността и колко елемента е - както ти го е написъл. Освен двете променливи за които ти е писал, всъщност само е пропуснал да ти каже, че ти трябва една променлива да пазиш, какъв е елемента ( в примера е 2), за да може накрая да го отпечаташ.
Поздрави,
Борис Гуцев

от Boris (3959 точки)


0
Ето ми решението поправено и работещо, ако някой запъне: http://pastebin.com/idVSkZyx . Simeon1024, nikola76 и Boris Gutsev, благодаря!

от varbanoff (2325 точки)


0
И аз досега я мъчих тази задача ето какво забърках.
http://pastebin.com/1kFdUmmg

от iwitass (3695 точки)


0
Според мен задачата е подобна нa Lines, ако последната е решена с двумерен масив, което е най-интуитивното решение може би. Едната разлика е, че ти имаш само едномерен масив, което е само една част от задачата Lines, другата е, че не е сигурно че търсиш само 1, което обаче не усложнява особено нещата. Ето я темата:
http://forums.academy.telerik.com/34148/c%23-%D0%B4%D0%BE%D0%BC%D0%B0%D1%88%D0%BD%D0%BE-%D0%BF%D0%BE%D0%B4%D0%B3%D0%BE%D1%82%D0%BE%D0%B2%D0%BA%D0%B0-%D0%B7%D0%B0-%D1%82%D0%B5%D1%81%D1%82-%D0%B8-%D0%B8%D0%B7%D0%BF%D0%B8%D1%82-%D0%B2%D1%81%D0%B8%D1%87%D0%BA%D0%B8-%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B8

от shristoff (747 точки)


5
Решението е почти вярно :) Само няколко малки грешки: 1. По принцип началната дължината на елементите трябва да е 1. 2. Първото число трябва да е винаги победител, защото масива може да е с дължина, която е равна на 1. 3. Имаше грешно извеждане на резултата в конзолата
Твоето решение с малко леките поправки + коментари към тях: http://pastebin.com/6f6uvECD
Поздравявам те за решението :) Моето решение е подобно, но с изнесено условие за проверка, за да не ми прави излишна проверка на всеки елемент.



5
Бих ти предложил малко по-лесен алгоритъм.
1) Ако текущия елемент ти е равен на следващия -> увеличи брояча с 1.
2) Ако не е направи брояча отново равен на 1.(равен е на 1, а не на 0, защото всеки елемент сам по себе си е поредица)
3) Ако текущия брояч ти е по-голям от най-дългия записан досега, го направи най-дългия.
http://pastebin.com/9ihavXR5

от kirov (4821 точки)


0
Много ми хареса това решение :) Лесно, но много ефективно!

от theminion (5 точки)


0
Аз тази я реших по следния начин. Използам структурата от данни Речник, като всеки ключ ми е уникално число от списъка, а стойността на ключа е броя срещания. И така обхождаш списъка от числа проверяваш дали има такъв ключ в речника - ако има го увеличаваш с 1, ако няма си създаваш нов ключ със стойност 1. Накрая обхождаш речника и намираш ключа с най-голямата стойност.

от alexm (50 точки)


0

Ето и моето решение с коментари из него, което следва логиката за увеличаване на брояча и сравняването му с максималния:

http://pastebin.com/0rJsidnp


от sylviapsh (302 точки)


0
Ето и моето решение
http://pastebin.com/0gaCNtnr

от borisfrenkev (165 точки)