Kezdőoldal » Számítástechnika » Programozás » Hogy tegyem egy tömbbe egy...

Hogy tegyem egy tömbbe egy másik tömbből a csak egyszer előforduló elemeket?

Figyelt kérdés

C# nyelv.


A lényeg, hogy ezt egy sorban gyönyörűen meg lehetne oldani úgy, hogy int[] amibe = amibol.Distinct.ToArray();


Viszont programozási tétel használatával kellene, írtam egy függvényt, linkelem: [link] (nem enged linkrövidítőt használni, de a pastebin nem ad "rendes" linket, ha mégis, akkor nyugodtan mutasd meg válaszban, hol)


A függvényt a programozási tétel pszeudokódja alapján írtam, amiről a képet itt linkelem: [link]


Ugye pszeudoban az indexelés 1-ről, C#-ban pedig 0-ról kezdődik, azért térnek el a számok/relációs jelek, de valószínűleg ebben a részében követtem el mégis hibákat, amikre sehogy se jövök rá, és ebben kérem a segítséget. A függvény nem azt csinálja, amit szeretnék, hogy csináljon.)


Amit írtam függvényt, tudom, hogy nem pontosan a programozási tétel lemásolása, mert nem az eredeti tömb elejére szeretném tenni a különböző elemeket (a végét pedig meghagyni "memóriaszemét"nek), hanem egy új tömböt szeretnék létrehozni, amiben csak a különböző elemek vannak, és pontosan annyi eleme van, amennyi a kiszűrés után marad.


2019. nov. 25. 10:01
1 2
 1/14 A kérdező kommentje:

A link tehát (hogy könnyebb legyen vágólapra tenni és az URL-t átírni)


[link] pdME8VRM

2019. nov. 25. 10:04
 2/14 anonim ***** válasza:
100%

Nem tudom, tétel-e, de én készítenék egy listát.

Sorban megyek az eredeti tömbön, és ha a listában nincs olyan elem még (mylist.Contains()), akkor felveszem. Ha van benne (azaz true a contains), akkor remove-olom a listből. Aztán ha végigértünk, lehet másolni tömbbe. Nem szép megoldás, de működik.

A szép megoldás a distinct toarray...

2019. nov. 25. 10:07
Hasznos számodra ez a válasz?
 3/14 A kérdező kommentje:
Köszönöm a választ, de sajnos, nem lehet listát használni. :(
2019. nov. 25. 10:17
 4/14 anonim ***** válasza:
100%
Én első körben rendezném a listát, majd minden elemet összehasonlítanék az előtte és az utána lévő elemme. De ennél biztos van jobb megoldás is.
2019. nov. 25. 10:51
Hasznos számodra ez a válasz?
 5/14 A kérdező kommentje:

A forrás tömb rendezett, így néz ki kb.: {1, 3, 4, 4, 5, 7, 8, 8, 8, 10, 10}

és ebből kéne {1, 3, 4, 5, 7, 8, 10}

De listát nem lehet használni, csak tömböket.

2019. nov. 25. 10:53
 6/14 tabaki ***** válasza:
100%

Lehet, hogy valami fontosat nem értettem meg a feladatból, de elsőre nem tűnik bonyolultnak. Először egy ciklusban megszámolod a nem ismétlődő elemeket (ezek a rendezett tömbben onnan ismerszenek meg, hogy nagyobbak az előzőnél), azután létrehozol egy ilyen méretű új tömböt, amelybe egy újabb ciklussal belemásolod őket az eredetiből. Egyszerűen lekezelhető különleges eset, ha a forrástömb lehet üres vagy egyetlen elemű.

[link]

2019. nov. 25. 12:28
Hasznos számodra ez a válasz?
 7/14 anonim ***** válasza:

Végigmész az egyiken elemenként (külső, számlálós), majd minden elem esetében egy belső while ciklussal (eldöntés tétele) eldöntöd, hogy a másik tömb tartalmazza-e az előző tömb éppen vizsgált elemét.


Az unió tétele is ilyen (ilyesmi), az egyik tömb teljes egészében másolásra kerül, a másik tömbből pedig azok az elemek, amiket az első nem tartalmaz. Ehhez kell egy eldöntés tétel.



Én egyébként szeretem a programozási tételeket, én magamtól túl bonyolultan oldanám meg, ezek meg egyszerűbb megoldást tanítanak.

Az se baj, ha az ember tudja, mi történik egy-egy Contains(), Distinct() vagy LINQ metódus mögött.

2019. nov. 25. 12:34
Hasznos számodra ez a válasz?
 8/14 A kérdező kommentje:

Köszi, próbálkozom vele!

Tök megörültem az URL-nek, azt hittem, forráskódot fog rejteni, de nem baj, nagyobb sikerélmény, ha nekem sikerül, de nagyon zsibbad az agyam. :D


A 11 elemű tömb kiírásánál 1-ről kezdtél el indexelni, hogy az 1 értékű, 0. indexű elemet "megette"?

2019. nov. 25. 12:36
 9/14 anonim ***** válasza:
54%

Nem feltétlen muszáj rendezni:


A = {8,8,4,3,3,1,10,1,8,3};

B = {0,0,0,0,0,0,0,0,0,0};


J = 0;

CIKLUS I = 0-TÓL 9-IG 1-VEL


B[J] = A[I];


K = 0;

CIKLUS AMIG B[K]<>B[J]

K = K + 1;

CIKLUS VÉGE


HA K = J AKKOR

J = J + 1;

ELÁGAZÁS VÉGE


CIKLUS VÉGE


ez esetben J az elemek számát tartalmazza

2019. nov. 25. 12:49
Hasznos számodra ez a válasz?
 10/14 anonim ***** válasza:

utolsó (12:49) voltam, persze dinamikus tömbbel valahogy így:

A := {8,8,4,3,3,1,10,1,8,3};

B := {};


J := 0;

K := 0;


CIKLUS I = 0-TÓL 9-IG 1-VEL


HA K = J AKKOR

B.PUSH(A[I]);

KÜLÖNBEN

B[J] := A[I];


K := 0;

CIKLUS AMIG B[K]<>B[J]

K := K + 1;

CIKLUS VÉGE


HA K = J AKKOR

J = J + 1;

ELÁGAZÁS VÉGE


CIKLUS VÉGE


HA K < J AKKOR

B.POP();

ELÁGAZÁS VÉGE

2019. nov. 25. 13:51
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!