Inhalt
Die Fakten:
Plattform: | codewars.com |
Name: | Simple Fun #88: Sort By Height |
Level: | 7 kyu |
Sprache: | TypeScript |
Beschreibung:
Task
Some people are standing in a row in a park. There are trees between them which cannot be moved.
Your task is to rearrange the people by their heights in a non-descending order without moving the trees.
Example
For a = [-1, 150, 190, 170, -1, -1, 160, 180]
, the output should be
[-1, 150, 160, 170, -1, -1, 180, 190]
.
Input/Output
-
[input]
integer arraya
If a[i] = -1, then the ith position is occupied by a tree. Otherwise a[i] is the height of a person standing in the ith position.
Constraints:
5 ≤ a.length ≤ 30,
-1 ≤ a[i] ≤ 200.
-
[output]
an integer arraySorted
array a with all the trees untouched.
Quelle: codewars.com
Lösung
Pseudo-Code
Wie immer gibt's reichlich Varianten, hier ist eine meiner.
Erst die Lösungsschritte in Pseudo-Code. Los geht’s:
Lösungsschritte
Schritt 1
Zuerst müssen die Bäume aus dem Weg: Wir entfernen die Bäume aus dem Input-Array.
Schritt 2
Das Ergebnis sortieren wir.
Schritt 3
Dann können wir jede Person im Input-Array durch eine Person aus dem sortierten Array (ohne Bäume) ersetzen.
Schritt 4
Das Ergebnis geben wir aus.
Code
Geil. Übersetzen wir unseren Pseudo-Code in TypeScript:
Lösungsschritte
Meine erste Zeile sieht so aus:
export function sortByHeight(list: number[]): number[] {
Bäume entfernen, Resultat sortieren und in einer Variablen speichern:
const sortedPeople = list
.filter((element) => element > 0)
.sort((a, b) => a - b);
Jede Person im Input-Array durch eine Person aus dem sortierten Array ersetzen.
Das Wort ‘jede’ gibt uns den Hinweis, dass wir einen Loop brauchen.
Zusammen mit dem Wort ‘ersetzen’ wissen wir, dass wir hier .map()
benutzen können:
list.map((element) => {
Woran erkennen wir eine Person? Eine Person wird niemals kleiner als 0
sein:
if (element > 0)
Aktuelles Element durch das erste Element in unseren sortierten Menschen ersetzen (und das erste Element aus den sortierten Menschen entfernen):
if (element > 0) return sortedPeople.shift()!;
Das Ausrufezeichen am Ende der Zeile sagt TypeScript
, dass es dieses Element auf jeden Fall gibt. Sonst hätte es Angst, dass es womöglich auf ein nicht existierendes Element stoßen könnte...
Andernfalls (wenn das Element ein Baum, also -1
, ist), geben wir es einfach zurück:
return element;
});
Das Ergebnis des Loops können wir direkt ausgeben. Also noch ein return
davor. Fertig!
return list.map((element) => {
if (element > 0) return sortedPeople.shift()!;
return element;
});
Voilá! 💪
Komplettlösung
export function sortByHeight(list: number[]): number[] {
const sortedPeople = list
.filter((element) => element > 0)
.sort((a, b) => a - b);
return list.map((element) => {
if (element > 0) return sortedPeople.shift()!;
return element;
});
}