Wypisanie 3 najwyższych wartości w liście

0

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

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.

4

Krok 1: posortuj
Krok 2: wez 3 pierwsze elementy

Dolna granica dla tego problemu to n ale nlogn raczej Cie nie boli :)

1
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

0

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.

0

@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());
    }
0

Generalnie oprocz dwoch ostatnich to powinno juz dzialac.

A te ostatnie no to nie mozesz na sztywno brac 3 elementow. Wez max(list.Length, 3) elementy.

3
public List<int> PersonalTopThree() =>
   new List<int> { 10, 30, 90, 30, 100, 20, 10, 0, 30, 40, 40, 70, 70 }.OrderByDescending(e => e).Take(3).ToList();
0
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();
            }

1 użytkowników online, w tym zalogowanych: 0, gości: 1