Auch Tag 2 ist relativ einfach. Du benötigst keine besonderen Java-Befehle außer der split()
-Methode aus Tag 1.
public boolean istAufsteigend(int[] levels) { for (int i = 1; i < levels.length; i++) { if (levels[i] <= levels[i-1]) {// Gleichheit ist ein Ausschlusskriterium! return false; } } return true; } public boolean istAbsteigend(int[] levels) { for (int i = 1; i < levels.length; i++) { if (levels[i] >= levels[i-1]) {// Gleichheit ist ein Ausschlusskriterium! return false; } } return true; } public boolean distanzOkay(int[] levels) { for (int i = 1; i < levels.length; i++) { if (Math.abs(levels[i-1] - levels[i]) < 1 || Math.abs(levels[i-1] - levels[i]) > 3) { return false; } } return true; } public void partOne() { int safeReports = 0; for (String line: inputLines) { // teile an den Leerzeichen auf String[] strLevels = line.split(" "); // deklariere & initialisiere ein int-Array int[] levels = new int[strLevels.length]; // "übersetze" die einzelnen Strings in Integer for (int i = 0; i < strLevels.length; i++) { levels[i] = Integer.parseInt(strLevels[i]); } //prüfe Auf-/Absteigend und Distanz if ((istAufsteigend(levels) || istAbsteigend(levels)) && distanzOkay(levels)) { safeReports++; } } System.out.println(safeReports); }
Für Teil 2 muss nur eine Kleinigkeit hinzugefügt werden!
break
die umgebende Schleife frühzeitig abbrechen!public int[] reduceArray(int[] levels, int index) { // das neue int-Array muss eins kürzer sein int[] rLevels = new int[levels.length-1]; // zum Speichern der aktuellen Einfügeposition im neuen Array int pos = 0; for (int i = 0; i < levels.length; i++) { if (i != index) { rLevels[pos] = levels[i]; pos++; } } return rLevels; } public void partTwo() { int safeReports = 0; for (String line: inputLines) { // teile an den Leerzeichen auf String[] strLevels = line.split(" "); // deklariere & initialisiere ein int-Array int[] levels = new int[strLevels.length]; // "übersetze" die einzelnen Strings in Integer for (int i = 0; i < strLevels.length; i++) { levels[i] = Integer.parseInt(strLevels[i]); } // erstelle pro Schleifendurchlauf ein reduziertes int-array, bei dem jeweils ein Index fehlt for (int i = 0; i < levels.length; i++) { int[] reducedLevels = reduceArray(levels, i); //prüfe Auf-/Absteigend if ((istAufsteigend(reducedLevels) || istAbsteigend(reducedLevels)) && distanzOkay(reducedLevels)) { safeReports++; break; } } } System.out.println(safeReports); }