Codewars Lösung | Hollow array


coden
Codewars. Achieve mastery through challenge.
Daniel Kaser|31. 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:Hollow array
Level:6 kyu
Sprache:TypeScript

Beschreibung:

An array is said to be hollow if it contains 3 or more 0s in the middle that are preceded and followed by the same number of non-zero elements. Furthermore, all the zeroes in the array must be in the middle of the array.

Write a function named isHollow/is_hollow/IsHollow that accepts an integer array and returns true if it is a hollow array,else false.

Quelle: codewars.com

Lösung

Pseudo-Code

Wie immer gibt es reichlich Varianten, hier ist eine meiner.

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

Lösungsschritte
Schritt 1

Als Erstes brauchen wir die Länge des Start-Teils, also den Teil ohne Nullen

Schritt 2

Dann können wir die Länge des Mittel-Teils berechnen

Schritt 3

Mit diesen beiden Werten können wir dann Anfang, Mitte und Ende extrahieren

Schritt 4

Dann nur noch prüfen, ob der Mittel-Teil nur Nullen enthält, die Länge des Mittel-Teils länger oder gleich 3 ist und ob Anfang und Ende jeweils keine Nullen enthalten.

Das war's schon!

Code

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

Lösungsschritte
Meine erste Zeile (ich habe x in nums umbenannt):
export function isHollow(nums: number[]): boolean {
Dann ermitteln wir die Länge des Anfangs:
const startLen = nums.indexOf(0);

Da der Anfang keine Nullen enthalten darf, definiert sich das Ende unseres Anfangs durch die erste 0. Wir suchen also einfach den Index der ersten 0. Danach muss dann der Mittel-Teil los gehen.

Mit der Länge des Anfangs können wir dann die Länge des Mittel-Teils berechnen:
const middleLen = nums.length - startLen * 2;

Da Anfang und Ende gleich lang sein müssen, können wir einfach 2x die Länge des Start-Teils von der Gesamtlänge abziehen.

Jetzt können wir Anfang, Mitte und Ende extrahieren:
const [start, middle, end] = [
  nums.slice(0, startLen),
  nums.slice(startLen, middleLen + 1),
  nums.slice(nums.length - startLen),
];

Ich deconstructe hier ein Array, weil ich das übersichtlicher finde. Du kannst auch gerne manuell für jeden Wert eine Variable erstellen und befüllen.

Dann prüfen wir, ob die Mitte wirklich ausschließlich aus Nullen besteht:
const isMiddleAllZeros = middle.every((num) => num === 0);

Das schreit nach einer .every() -Methode von JavaScript. Das Ergebnis speichern wir in einer Variablen und verwenden es im nächsten Schritt.

Außerdem prüfen wir noch, ob Anfang und Ende Nullen enthalten und die Mitte länger oder gleich 3 lang ist:
  return (
    isMiddleAllZeros && middleLen >= 3 && !start.includes(0) && !end.includes(0)
  );
}

Das Ergebnis können wir direkt zurückgeben.

Voilá! 💪

Fragen?

Komplettlösung
export function isHollow(nums: number[]): boolean {
  const startLen = nums.indexOf(0);
  const middleLen = nums.length - startLen * 2;

  const [start, middle, end] = [
    nums.slice(0, startLen),
    nums.slice(startLen, middleLen + 1),
    nums.slice(nums.length - startLen),
  ];

  const isMiddleAllZeros = middle.every((num) => num === 0);

  return (
    isMiddleAllZeros && middleLen >= 3 && !start.includes(0) && !end.includes(0)
  );
}

Feedback

Schreib mir!