[C#] Arrays - 9 задача


9

Услове:
Write a program that finds the most frequent number in an array. Example:
{4, 1, 1, 4, 2, 3, 4, 4, 1, 2, 4, 9, 3} -> 4(5 times)

Решение с масиви:

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

Решение с речник:

Проверяваме всяко число дали съществува в речника. Ако съществува -  увеличаваме неговия брояч с 1, а ако не - го добавям в речника със стойност 1.

Решения:
http://pastebin.com/Jajx1syn

 

edit: заглавие, тагове




Отговори



4
Моето също е с речник:
http://pastebin.com/c07LDLEg
1) Пълня речника
2) С ламбда израз вземам ключа и стойноста
3)Принтя
Ако някой може да ми каже по-добър начин за вземане на ключа с максимална стойност, моля пишете коментар :)
Едит: Може да се направи и без ламбда израз,както е писал колегата по-долу(дори е по-добре), просто уча нови неща и се опитвам да ги прилагам в решения. :)

от kirov (4821 точки)


0
Въпреки, че работи по-бавно с ламбдите, изглежда готино :)

от ivivanov (903 точки)

0
int count = elementsInArray.Max(x => x.Value); int number = elementsInArray.First(x => x.Value == count).Key;
Но ако имаш две числа, които да се повтарят еднакъв максимален брой пъти, май ще имаш проблеми с този ти подход:)

от kdikov (3407 точки)



3
Можеш и да си подредиш масива и след това се сещаш. :)

от nikola76 (1250 точки)


2
http://pastebin.com/LhCR85w4 -- едно пак простичко решение, без ламда изрази, тъй като те по презюмция правят по няколко итерации на контейнера. Така че е една идея по-бавно :)

от Prophian (1234 точки)


0
Ако е така написана задачата няма да ти работи със отрицателни стойности, поне при мен не работеше.( Не съм сигорен дали трябва да се прави така проверка)

от viraldim (0 точки)

0
Mда, така написана не работи с отрицателни стойности, тъй като търсим индекс с минусов елемент, но пък в задачата не е написано как и защо, така че номера минава :)

от Prophian (1234 точки)


6

Ето едно решение и от мен:

http://pastebin.com/kkq7zR9Q

Какво правя ?

1. Ако не знаете какво е речник, потърсете в интернет. Основната ми идея в задачата се базира в/у тази структура.

Препоръчвам ви да погледнете тук: http://www.dotnetperls.com/dictionary

2. С един цикъл обикалям по всички стойности на масива си ( този който го взимам от входа ). Ако стойността на даден елемент не съществува в речника ми, добавям я с ключ стойност на елемента и стойност към този ключ 1 ( до сега съм я срещнал 1 път ) , а ако съществува просто увеличава стойността на дадения ключ с 1.

Забележка: При работа с речници използвате: TryGetValue(), а не ContainsKey() . Първия е по-бърз. Източник: http://www.dotnetperls.com/trygetvalue

3. След като сме попълнили нащия речник с обикновен foreach обикаляме всичките му елементи и ги сравняваме по стойност (Value) и ако стойноста им е по-голяма от най-голямата срещана до сега я запзваме в отделна променлива. Също така имам и променлива пазеща ключа на най-често срещания елемент в речника ( на често срещания елемент в нашия вход ).

Забелжека: Защо присвоявам на int bestFrequnecy = int.MinValue; ? Ами така се подсигурявам, че при сравнението първия елемент ще бъде присвоен веднага на променливата т.к. което и да е число винаги е по-голямо от най-малката стойност на int.


от Teodor92 (13062 точки)


0
Поради някаква странна причина ми дава, че линка на trugetvalue e невалиден.
Иначе относно бързината, аз предпочитам containskey, защото ми е по-четимо от извеждане във външна променлива, но всеки с решението си. Иначе trygetvalue, не е по-бърз, но когато добавяш стойност към външна променлива вместо към value на key, става по-бързо. Тоест по-бързото е операцията за присвояване към външна променлива(малко гийк спор :D). Браво за подробното обяснение. :)

от kirov (4821 точки)

0
Поправих линка. Относно това защо е по-бърз, не мога да кажа т.к. не съм навлизал в дълбочина, просто следвам препоръките от източника, който съм посочил :)

от Teodor92 (13062 точки)



4
Ето едно от мене с масив и броячи .. same old, same old https://github.com/martinivanovit/SimpleProjects/blob/master/MostFrequentElement

от Mahata231 (1351 точки)


0
Браво колега, все едно гледам моето решение. Класика :)

от Assi.NET (3050 точки)

0
Колега, ако най-често срещаното число е отрицателно или нула, с тази проверка накрая (if (mostFrequent > 0 && maxCounter > 1)), ще е грешен резултата. По-скоро проверката да е само за maxCounter > 1. Поправете ме ако греша, но не видях някъде да се казва, че са само положителни числата сякаш.

от sylviapsh (302 точки)



1
http://pastebin.com/APVwmZxL

от Rokata (397 точки)


0
Аз я реших с две промениливи едната за най-често срещаната стойост, другата за индекса, които има тази стойност

от iwitass (3695 точки)


1
Аз реших задачата като първо сортирах и от там нататък мисля става елементарно. :)

от RamiAmaire (1868 точки)


0
аз реших задачата, както следва: 1) подредих масива 2) проверих подредените елементи, кой се повтаря най-много пъти

от Dimov (907 точки)

0
Дам, доста лесно се получава. ;]]

от RamiAmaire (1868 точки)



2

http://pastebin.com/UVwG5Xes

1) подредих масива
2) проверих подредените елементи, кой се повтаря най-много пъти


от Dimov (907 точки)


2

Здравейте!

Задачата я реших като проверявам от index[0] до последния, дали index[0] == на някои следващ, след това от index[1] до последния дали index[1] == на някои от следващите. Ако октрие такъв запазвам стойноста на индекса (числото) в променлива. След което увеличавам брояча++, който ми казва колко пъти се повтаря даденото число. В общи линии това ми е алгоритъма.

http://pastebin.com/zd9uEsaX

 


от Assi.NET (3050 точки)


0
Имаш един бъг в кода.брояча counter трябва да има начална стойност 0.

от Nejdet Shakir (0 точки)

0
Ти тества ли как разбра че има бъг ?
Това не е доказателство, аз пък мога да кажа че ако брояча има начална стойност 0 - има бъг :)
Доказателство: Нали проверявам всяко едно число дали има друго такова в масива, е щом проверявам някакво число значи то вече съществува един път и затова брояча започва от 1. Следователно ако се намери още едно такова число брояча става 2 и => даденото число се повтаря 2 пъти.

от Assi.NET (3050 точки)