Inhalt
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 0
s 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á! 💪
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)
);
}