Találja meg az összes számpárot egy tömbben, amely összeadódik egy adott összeggel a Java-ban

1. Áttekintés

Ebben a gyors bemutatóban megmutatjuk, hogyan lehet megvalósítani egy algoritmust az összes számpár megtalálásához egy tömbben, amelynek összege megegyezik egy adott számmal. Összpontosítunk a probléma két megközelítése.

Az első megközelítésben megtaláljuk az összes ilyen párt, egyediségtől függetlenül. A másodikban csak az egyedi számkombinációkat találjuk, eltávolítva a felesleges párokat.

Mindegyik megközelítéshez két megvalósítást mutatunk be - egy hagyományos megvalósítást mert hurkok, és egy második a Java 8 Stream API segítségével.

2. Helyezze vissza az összes megfelelő párot

Egy egész szám tömbön keresztül iterálunk, megkeressük az összes párot (én és j), amelyek összegzik a megadott számot (összeg) nyers erővel, beágyazott hurok megközelítéssel. Ennek az algoritmusnak a futásideje bonyolult lesz O (n2).

Bemutatónkhoz megkeressük az összes számpárot, amelynek összege megegyezik 6, a következők használatával bemenet sor:

int [] bemenet = {2, 4, 3, 3}; 

Ebben a megközelítésben algoritmusunknak vissza kell térnie:

{2,4}, {4,2}, {3,3}, {3,3}

Mindegyik algoritmusban, amikor találunk egy célszámot, amely összegzi a célszámot, összegyűjtjük a párot egy segédprogram módszerével, addPairs (i, j).

A megoldás megvalósításának első lehetséges módja a hagyományos használata mert hurok:

for (int i = 0; i <input.length; i ++) {for (int j = 0; j <input.length; j ++) {if (j! = i && (input [i] + input [j]) == összeg) {addPairs (bemenet [i], összegbevitel [i])); }}}

Ez kissé kezdetleges lehet, tehát írjunk egy megvalósítást a Java 8 Stream API segítségével is.

Itt a módszert alkalmazzuk IntStream.range hogy szekvenciális számfolyamot generáljon. Ezután szűrjük őket állapotunk szerint: 1. szám + 2. szám = összeg:

IntStream.range (0, input.length) .forEach (i -> IntStream.range (0, input.length) .filter (j -> i! = J && input [i] + input [j] == összeg) .forEach (j -> addPairs (bemenet [i], bemenet [j]))); 

3. Helyezze vissza az összes egyedi párost

Ehhez a példához muszáj lesz dolgozzon ki egy intelligensebb algoritmust, amely csak az egyedi számkombinációkat adja vissza, elhagyva a redundáns párokat.

Ennek érdekében minden elemet hozzáadunk egy kivonatkártyához (rendezés nélkül), először ellenőrizzük, hogy a pár már látható-e. Ha nem, akkor lekérjük és megjelöljük az ábrán látható módon (set érték mező as nulla).

Ennek megfelelően ugyanazt használva bemenet tömb, mint korábban, és egy célösszeg 6, algoritmusunknak csak a különböző számkombinációkat kell visszaadnia:

{2,4}, {3,3}

Ha hagyományost használunk mert hurok, lesz:

Térkép párok = új HashMap (); for (int i: input) {if (párok.koncertKulcs (i)) {if (párok.get (i)! = null) {addPairs (i, sum-i); } párok.put (összeg - i, null); } else if (! párok.containsValue (i)) {párok.put (összeg-i, i); }}

Vegye figyelembe, hogy ez a megvalósítás javítja a korábbi összetettséget, mint csak egyet használunk mert hurok, tehát meglesz Tovább).

Most oldjuk meg a problémát a Java 8 és a Stream API segítségével:

Térkép párok = új HashMap (); IntStream.range (0, input.length) .forEach (i -> {if (pairs.containsKey (input [i]))) {if (pairs.get (input [i])! = Null) {addPairs (input [ i], sum - input [i]);}} pair.put (összeg - input [i], null);} else if (! pair.containsValue (input [i])) {pair.put (összeg - input [ i], bemenet [i]);}});

4. Következtetés

Ebben a cikkben többféle módszert ismertettünk, hogy megtaláljuk az összes olyan párt, amely egy adott számot összegez Java-ban. Két különböző megoldást láttunk, amelyek mindegyike két Java alapmódszert használt.

Szokás szerint az ebben a cikkben bemutatott összes kódminta megtalálható a GitHub-on - ez egy Maven-projekt, ezért könnyen össze kell állítani és futtatni.


$config[zx-auto] not found$config[zx-overlay] not found