Inhalt
Die Fakten:
Plattform: | codewars.com |
Name: | Length of missing array |
Level: | 6 kyu |
Sprache: | TypeScript |
Beschreibung:
You get an array of arrays.
If you sort the arrays by their length, you will see, that their length-values are consecutive.
But one array is missing!
You have to write a method, that return the length of the missing array.
Example:
[[1, 2], [4, 5, 1, 1], [1], [5, 6, 7, 8, 9]] --> 3
If the array of arrays is null/nil or empty, the method should return 0.
When an array in the array is null or empty, the method should return 0 too!
There will always be a missing element and its length will be always between the given arrays.
Have fun coding it and please don't forget to vote and rank this kata! :-)
I have created other katas. Have a look if you like coding and challenges.
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
Als Erstes sollten wir die Länge jedes Elements ermitteln. Am besten in einem Loop.
Schritt 2
Dann können wir die Längen sortieren.
Schritt 3
Dann brauchen wir einen weiteren Loop.
Schritt 4
Wenn ein Element 0
ist, können wir direkt abbrechen und 0
zurückgeben.
Schritt 5
Ansonsten kucken wir, ob die aktuelle Zahl gleich ihrem Index + der ersten Zahl im Array ist*.
* Die erste Zahl addieren wir, weil wir nicht wissen, mit welcher Länge es losgeht. Im Beispiel in der Kata-Beschreibung geht es bei 1
los. Es kann aber auch bei z.B 7
losgehen. Fies, ich weiß.
Schritt 6
Wenn nicht, können wir direkt abbrechen und den Index +
der ersten Zahl zurückgeben.
Schritt 7
Wenn der Loop es schafft komplett durchzulaufen, können wir 0
zurückgeben.
Code
Geil. Übersetzen wir unseren Pseudo-Code in TypeScript:
Lösungsschritte
Meine erste Zeile (ich habe arrayOfArrays
umbenannt):
export function getLengthOfMissingArray(arrays: any[]): number {
Erst ermitteln wir die Längen jedes Elements und sortieren danach:
const sortedLengths = arrays.map((arr) => arr.length).sort((a, b) => a - b);
Das können wir mit .map()
und .sort()
in einer Zeile mit Method-Chaining machen.
Der Übersichtlichkeit halber, speichere ich mir das erste Element in eine Variable:
const start = sortedLengths[0];
Wir werden es später brauchen.
Jetzt der zweite Loop:
for (let i = 0; i < sortedLengths.length; i++) {
Hier nehme ich einen for
-Loop, damit wir ihn unter bestimmten Voraussetzungen vorzeitig beenden können. Das geht leider nicht mit einer Array-Method.
Der Lesbarkeit halber, speichere ich das aktuelle Element wieder in eine Variable:
const curr = sortedLengths[i];
Jetzt der Test, ob das Element 0
ist:
if (!curr) return 0;
Wenn ein Element 0
ist, also ein leeres Array dabei ist, sollen wir 0
zurückgeben.
Jetzt können wir testen, ob das aktuelle Element gleich seinem Index +
der ersten Zahl (start
) ist:
if (curr !== i + start) return i + start;
}
Wenn sie es nicht ist, können wir sofort die fehlende Länge, also den Index +
start zurückgeben.
Ansonsten geben wir nach dem Loop 0
zurück:
return 0;
}
Voilá! 💪
Komplettlösung
export function getLengthOfMissingArray(arrays: any[]): number {
const sortedLengths = arrays.map((arr) => arr.length).sort((a, b) => a - b);
const start = sortedLengths[0];
for (let i = 0; i < sortedLengths.length; i++) {
const curr = sortedLengths[i];
if (!curr) return 0;
if (curr !== i + start) return i + start;
}
return 0;
}