← Notizen

Vorzeichenbehaftete Werte in Java mit IntStream addieren

Wenn Beträge und Vorzeichen getrennt vorliegen, wird vor dem Addieren das Vorzeichen am jeweiligen gemeinsamen Index angewendet. signs[i] bedeutet bei true positiv und bei false negativ. Ein bedingter Ausdruck rekonstruiert daher jeden Wert.

Die Aufgabe garantiert gleiche Arraylängen von 1 bis 1.000 und Beträge von 1 bis 1.000. Ein separates Sortieren der Vorzeichen würde ihre Zuordnung zu den ursprünglichen Werten zerstören; die Arrays sind in der vorgegebenen Reihenfolge zu verarbeiten.

Ablauf

Denselben Index in beiden Arrays lesen, das Vorzeichen anwenden und anschließend die vorzeichenbehafteten Werte addieren.

Denselben Index in beiden Arrays lesen, das Vorzeichen anwenden und anschließend die vorzeichenbehafteten Werte addieren.

Zugehörige Indizes gemeinsam lesen

Diese vollständige Klasse als Solution.java speichern. Sie wurde für Java 11 kompiliert und auf JDK 17 ausgeführt.

import java.util.stream.IntStream;

public class Solution {
    public int solution(int[] absolutes, boolean[] signs) {
        return IntStream.range(0, absolutes.length)
                .map(i -> signs[i] ? absolutes[i] : -absolutes[i])
                .sum();
    }
}

IntStream.range schließt Index 0 ein und absolutes.length aus. map wendet das Vorzeichen auf jeden Betrag an, und sum addiert die entstandenen Werte. Die Methode verändert weder die Eingabe noch erzeugt sie ein separates Array vorzeichenbehafteter Werte.

Betrag Vorzeichen Tatsächlicher Wert
4 true 4
7 false -7
12 true 12

Diese Werte ergeben zusammen 9. Die Eingabe [1,2,3] mit [false,false,true] hebt sich zu 0 auf. Nur die positiven und negativen Flags zu zählen reicht nicht: Auch der Betrag jedes Summanden ist entscheidend.

Ganzzahlgrenzen und Vertrag

Es gibt höchstens 1.000 Summanden mit einem Betrag von jeweils höchstens 1.000. Der Absolutwert der Summe ist daher durch 1.000.000 begrenzt. Selbst die Grenzfälle mit ausschließlich positiven oder negativen Werten passen in int. Die Laufzeit beträgt O(n), der zusätzliche Speicherbedarf O(1).

Die Methode setzt die gültigen Beträge und gleichen Längen der Aufgabe voraus. Sie ersetzt keine Prüfungen auf null, Längen und Werte bei beliebigen Anwendungseingaben. Bei größeren Grenzen müssen sowohl der Typ der Summanden als auch der des Akkumulators neu bewertet werden.

Zum Vergleich dienen Array-Skalarprodukte als weitere Berechnung mit zwei Arrays und eine Folge mit Abstand x unter Verwendung von long für Ergebnisse außerhalb des int-Bereichs. Der Leitfaden zu Java-Programmieraufgaben bietet einen Lernpfad.

Diskussion

Auf GitHub ansehen ↗