Codewars Lösung | Difference of 2


coden
Codewars. Achieve mastery through challenge.
Daniel Kaser|29. August 2024
3 min.

Inhalt

  1. Die Fakten
  2. Beschreibung
  3. Lösung
    1. Pseudo-Code
    2. Code
  4. Feedback

Die Fakten:

Plattform:codewars.com
Name:Difference of 2
Level:6 kyu
Sprache:JavaScript

Beschreibung:

The objective is to return all pairs of integers from a given array of integers that have a difference of 2.

The result array should be sorted in ascending order of values.

Assume there are no duplicate integers in the array. The order of the integers in the input array should not matter.

Examples

```
[1, 2, 3, 4]  should return [[1, 3], [2, 4]]

[4, 1, 2, 3]  should also return [[1, 3], [2, 4]]

[1, 23, 3, 4, 7] should return [[1, 3]]

[4, 3, 1, 5, 6] should return [[1, 3], [3, 5], [4, 6]]
```
```
[1, 2, 3, 4]  should return [(1, 3), (2, 4)]

[4, 1, 2, 3]  should also return [(1, 3), (2, 4)]

[1, 23, 3, 4, 7] should return [(1, 3)]

[4, 3, 1, 5, 6] should return [(1, 3), (3, 5), (4, 6)]
```

Quelle: codewars.com

Lösung

Pseudo-Code

Es gibt wie immer viele Varianten, hier ist eine meiner.

Erst die Lösungsschritte in Pseudo-Code. Los geht’s:

Lösungsschritte
Schritt 1

Ich schlage vor, als Erstes sortieren das Input-Array.

Schritt 2

Außerdem brauchen wir eine Variable um die gefundenen Paare zu speichern.

Schritt 3

Dann können wir durch das Input-Array loopen.

Schritt 4

Mit einem zweiten, inneren Loop können wir die zweite Zahl erfassen.

Schritt 5

Dann prüfen wir, ob die aktuelle (erste) Zahl + 2 gleich der zweiten Zahl ist.

Schritt 6

Wenn ja, fügen beide Zahlen in einem Array an unser Ergebnis-Array an.

Schritt 7

Nach beiden Loops nur noch das Ergebnis zurückgeben.

Code

Geil. Übersetzen wir unseren Pseudo-Code in JavaScript:

Lösungsschritte
Meine erste Zeile:
function twosDifference(nums) {
Zuerst das Input-Array sortieren:
const sortedNums = [...nums].sort((a, b) => a - b);

Vor dem Sortieren erstelle ich eine Kopie des Input-Arrays, indem ich es in ein neues Array spreade. Dadurch bleibt das Input-Array unberührt.

Dann noch die Variable um unsere Ergebnisse, die Paare zu speichern:
const pairs = [];
Jetzt der erste, äußere Loop:
  for (let i = 0; i < nums.length; i++) {

Standart for-Loop. Nüscht Besonderes.

Dann der zweite, innere Loop:
    for (let j = i + 1; j < nums.length; j++) {

j ist hier immer einen größer als i. Wir fangen also immer eine Zahl nach der aktuellen (i) an und gehen den Rest der Zahlen durch.

Jetzt können wir der Übersicht halber die erste und die zweite Zahl in Variablen speichern (optional):
const first = sortedNums[i];
const second = sortedNums[j];
Dann der Test, ob die erste Zahl + 2 gleich der zweiten ist:
      if (first + 2 === second) pairs.push([first, second]);
    }
  }

Wenn ja, fügen wir das Paar als Array hinten an das Ergebnis-Array an.

Das war’s schon für beide Loops.

Nach den Loops nur noch das Ergebnis-Array zurückgeben:
  return pairs;
}
Voilá! 💪

Fragen?

Komplettlösung
function twosDifference(nums) {
  const sortedNums = [...nums].sort((a, b) => a - b);
  const pairs = [];

  for (let i = 0; i < nums.length; i++) {
    for (let j = i + 1; j < nums.length; j++) {
      const first = sortedNums[i];
      const second = sortedNums[j];

      if (first + 2 === second) pairs.push([first, second]);
    }
  }

  return pairs;
}

Feedback

Schreib mir!