Kezdőoldal » Számítástechnika » Programozás » C#-ban hogyan lehet egy...

C#-ban hogyan lehet egy listában megkeresni azokat a számokat, amikből kettő van?

Figyelt kérdés

2020. jan. 23. 18:43
1 2
 1/18 anonim ***** válasza:
45%
myNumbers.Where(numberToCount => myNumbers.Count(number => number == numberToCount) == 2).Distinct()
2020. jan. 23. 19:00
Hasznos számodra ez a válasz?
 2/18 anonim ***** válasza:
50%

#1, egy ilyen feladathoz egészen biztosan nem LINQ kell, de ha a Kérdező véletlen önmagától szórakozik ilyen feladatokkal, mert tanulni akar, akkor se hinném, hogy LINQ-val akarná megoldani.


Egyébként ez egy eldöntés és kiválogatás tétele nagyjából (és asszem), két for ciklus, a belső i+1-től indul, végigmenni és megszámolni (sőt, igazából a belső while i+1-től, igazából így eldöntés, ha már megvan a 3. az i-edikből, tehát éppen aktuális számból, akkor nem kell tovább menni és azt a számot nem kell kiválogatni. Ha végigértél és csak 1 db volt, maga az i., akkor nem kell kiválogatni. Ha kettő volt, beteszed abba a kollekcióba, amibe kiválogatsz.

2020. jan. 23. 21:40
Hasznos számodra ez a válasz?
 3/18 anonim ***** válasza:

De kedvet kaptam megírni C-ben. :D



((Egyébként biztosan túlbonyolítom.))

2020. jan. 23. 22:03
Hasznos számodra ez a válasz?
 4/18 anonim ***** válasza:

Elsőre jónak tűnik:


https://pastebin (pont) com/fYRxeVKX



Szóval for ciklussal végigmész a számokon.

Amelyiknél tartasz, ott egyrészt megnézed, hogy korábban vizsgáltad-e már (amíg ezt nem néztem, olyan számot is kiadott, amiből 3 db vagy több volt), másrészt megnézed, hogy a továbbiakban hány db lesz belőle. Én addig mentem el while-al, amíg csak kettőt talált, amint megvolt a harmadik, kiléptem.


Már ha jól értem a feladatot, és az a kérdés, hogy melyekből van _pontosan_ kettő.


A programozási nyelvért bocsi, de nagyon hasonló a szintaktikája. ;)


Aki meg idetéved, ne legyen rosszul attól, ahogyan a C-t használom. :D :D

2020. jan. 23. 22:52
Hasznos számodra ez a válasz?
 5/18 anonim ***** válasza:

Tehát

- végigmész a listán

- az aktuális elem utáni elemtől kezdve megnézed van-e ugyanolyan mint az aktuális

- ha nincs, nem számít

- ha van megnézed mi volt már korábban egy 3. beágyazott ciklussal...


szerintem túlbonyolítod, illetve nem logikus a kódod, bár működik.


Simán nézd meg 2 egymásba ágyazott ciklussal, elejétől végéig. Az hogy i+1-től nézed bonyolítás, hiszen később meg kell nézni a korábbi elemeket is. (Nyilván az optimalizációkat érdemes berakni, max 3 elemig nézni, illetve ha olyan számot nézünk mint ami már volt azon túllépni)


A te kódodat, változóidat felhasználva, pl így:

    int i, j, idx = 0, count, index;

 

    for (i = 0; i < len; ++i)

    {

        // számoljuk meg hány olyan van ami == num[i]-vel, de max 3-ig számoljunk

        count = 0;

        for (j = 0; j < len && count < 3; ++j)

        {

            if (nums[i] == nums[j])

            {

                if (j < i)

                {

                    // ez a szám már volt korábban

                    break;

                }


                count++;

            }

        }


        if (count == 2)

        {

            doubles[idx] = nums[i];

            ++idx;                    

        }

    }

 

    return idx;

2020. jan. 23. 23:48
Hasznos számodra ez a válasz?
 6/18 tabaki ***** válasza:

Örömmel látom, hogy mindkét változat működik C#-ban is:

[link]

Kíváncsi vagyok Kérdező kódjára, most az egyszer nyilván nem fog eltűnni a balfenéken, ahogy szokott.

2020. jan. 24. 00:24
Hasznos számodra ez a válasz?
 7/18 anonim ***** válasza:

Optimális megoldást akkor lehetne mondani, ha ismernénk a részleteket. Milyen intervallumba tartoznak a számok, hány db lehet a listában, amiből nem kettő van abból bármennyi lehet-e vagy mondjuk csak 1 vagy 3 stb.


A négyzetes komplexitású megoldáshoz meg illene odaírni azért megjegyzésként, hogy oké, hogy működik, de performancia szempontjából az egyik legrosszabb megoldás.

2020. jan. 24. 06:08
Hasznos számodra ez a válasz?
 8/18 anonim ***** válasza:

Remélhetőleg nem tévesen feltételezem, hogy nem pontosan két darabot, hanem kettő vagy több darabot, tehát úgy általában a duplikált elemeket keresnéd.


Végigiterálsz a listán, és ahol a FindAll (értékre) egynél hosszabb listával tér vissza, azt az értéket hozzáadod egy sethez (így minden érték csak egyszer szerepel az eredményben).

Rövid, tömör, és relatíve jól olvasható. Teljesítmény tekintetében mondhatni botrányos, de optimalizálni eleve csak akkor szabad, ha kifejezetten szükség van rá (ld. "premature optimization"); ebben az esetben számos lehetőség kínálkozik a futásidő javítására.


Körülbelül (nem volt szempont, hogy másolható legyen, csak szemléltetés):


public HashSet<T> FindDuplicates(List myList)

{

˙˙˙˙var duplicates = new HashSet<T>();

˙˙˙˙myList.forEach(delegate(T item)

˙˙˙˙{

˙˙˙˙˙˙˙˙if (myList.FindAll(delegate(T other) { other == item }).Count > 1)

˙˙˙˙˙˙˙˙{

˙˙˙˙˙˙˙˙˙˙˙˙duplicates.Add(item);

˙˙˙˙˙˙˙˙}

˙˙˙˙});

˙˙˙˙return duplicates;

}


Amennyiben mégis pontosan kettő darabot keresnél, úgy az if-ben a feltételt kell "> 1"-ről "== 2"-re módosítani.

2020. jan. 24. 09:58
Hasznos számodra ez a válasz?
 9/18 anonim ***** válasza:
100%
Jó látni, hogy van egy hely, ahova az ember behányja a házi feladatát és néhány inas ugrik is és megcsinálja ingyen :)
2020. jan. 24. 11:10
Hasznos számodra ez a válasz?
 10/18 anonim ***** válasza:

De mi motiválja őket vajon?

Mert iskolában még érthető, ahol megverik a csicskát, ha nem csinálja meg a házit. De itt?

2020. jan. 24. 11:19
Hasznos számodra ez a válasz?
1 2

Kapcsolódó kérdések:





Minden jog fenntartva © 2024, www.gyakorikerdesek.hu
GYIK | Szabályzat | Jogi nyilatkozat | Adatvédelem | Cookie beállítások | WebMinute Kft. | Facebook | Kapcsolat: info(kukac)gyakorikerdesek.hu

A weboldalon megjelenő anyagok nem minősülnek szerkesztői tartalomnak, előzetes ellenőrzésen nem esnek át, az üzemeltető véleményét nem tükrözik.
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!