Witam, mam problem z taką listą:
List<int> list = new List<int> { 10, 30, 90, 30, 100, 20, 10, 0, 30, 40, 40, 70, 70 };
Jak wypisać trzy największe wartości z tej listy?
Witam, mam problem z taką listą:
List<int> list = new List<int> { 10, 30, 90, 30, 100, 20, 10, 0, 30, 40, 40, 70, 70 };
Jak wypisać trzy największe wartości z tej listy?
1 link z google
https://lmgtfy.app/?q=how+to+get+first+n+element+from+list+C%23
nie wiem jak się za to zabrać i jaką metodą to zrobić a szukałem już dużo w dokumentacji
To chyba proste, znaleźć maksimum, odłożyć na bok, znowu szukać maksimum, tylko teraz ignorować to wcześniejsze i jeszcze raz to samo, tylko ignorować oba poprzednie.
stivens napisał(a):
Dolna granica dla tego problemu to n ale nlogn raczej Cie nie boli :)
Problem jest O(n)
buildMaxHeap to O(n)
takeMax from heap to O(1)
O(n) + 3 * O(1) = O(n)
PS
Wiem, dla OPa to nie pomoc, ale gdyby ktoś próbował rekrutacji z Codility itp to warto wiedzieć co to Heap, co to heapify, jak się buduje heap i dlaczego to O(n).
Ostatnio Codility i podobne algorytmiki są co raz częściej spotykane
Zdjecie (usuniecie) elementu z kopca jest O(logn) ;)
A potrzebujesz 3 elementy a nie jeden.
Edit: chociaz w sumie to jest O(n) + O(3logn) wiec O(n).
Ale na prawde nie sadze zeby dla OPa to mialo znaczenie... Ergo niepotrzebnie w ogole o tym gadamy.
@lion137:Dzięki za pomoc!, zrobiłem to twoim sposobem:
public List<int> PersonalTopThree()
{
List<int> list = new List<int> { 10, 30, 90, 30, 100, 20, 10, 0, 30, 40, 40, 70, 70 };
List<int> lista = new List<int>();
list.Sort();
for (int i = 0; i < 3; i++)
{
lista.Add(list.Max());
list.Remove(list.Max());
}
return lista;
Ogólnie to sprawa wygląda tak, że robię zadanka na praktyki (jestem na kierunku technik informatyk 3 rok, więc moje umiejętności nie są zbyt duże :p) i muszę napisać program tak aby przeszedł testy jednostkowe. Więc udał się pierwszy test z pięciu które wkleję poniżej (wcześniej było jeszcze kilka ale z nimi sobie poradziłem). Pytanie jak zrobić cztery następne testy? Będzie to trochę bardziej złożone. Oczywiście pokminie to sam, ale będe bardzo wdzięczny jak dacie mi jakieś wskazówki :)
[Fact]
public void Personal_top_three_from_a_list_of_scores()
{
var sut = new HighScores(new List<int> { 10, 30, 90, 30, 100, 20, 10, 0, 30, 40, 40, 70, 70 });
Assert.Equal(new List<int> { 100, 90, 70 }, sut.PersonalTopThree());
}
[Fact(Skip = "Remove this Skip property to run this test")]
public void Personal_top_highest_to_lowest()
{
var sut = new HighScores(new List<int> { 20, 10, 30 });
Assert.Equal(new List<int> { 30, 20, 10 }, sut.PersonalTopThree());
}
[Fact(Skip = "Remove this Skip property to run this test")]
public void Personal_top_when_there_is_a_tie()
{
var sut = new HighScores(new List<int> { 40, 20, 40, 30 });
Assert.Equal(new List<int> { 40, 40, 30 }, sut.PersonalTopThree());
}
[Fact(Skip = "Remove this Skip property to run this test")]
public void Personal_top_when_there_are_less_than_3()
{
var sut = new HighScores(new List<int> { 30, 70 });
Assert.Equal(new List<int> { 70, 30 }, sut.PersonalTopThree());
}
[Fact(Skip = "Remove this Skip property to run this test")]
public void Personal_top_when_there_is_only_one()
{
var sut = new HighScores(new List<int> { 40 });
Assert.Equal(new List<int> { 40 }, sut.PersonalTopThree());
}
List<int> list = new List<int> { 10, 30, 90, 30, 100, 20, 10, 0, 30, 40, 40, 70, 70 };
var listaWynikow = Sortowanie(list, 3);
List<int> Sortowanie(List<int> lista, int ilosc)
{
var result = new int[ilosc];
Array.Copy(lista.OrderByDescending(x => x).ToArray(), result, result.Length);
return result.ToList();
}