Codewars Lösung | Length of missing array


coden
Codewars. Achieve mastery through challenge.
Daniel Kaser|4. März 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: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á! 💪

Fragen?

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;
}

Feedback

Schreib mir!