Ich habe ein großes Array beliebiger Größe. Es ist eine quadratische Anordnung. Ich versuche zu verstehen, wie ich es diagonal durchqueren kann wie ein /
und nicht ein \
(was ich bereits weiß). Ich habe den folgenden Code bis jetzt:
Ich habe drei Loops, weil ich so die andere Diagonale gemacht habe:
%Vor%Bei meinen Versuchen gehe ich weiter über die Grenzen hinaus und erhalte eine ElementOutOfBounds-Ausnahme. Angenommen, das Array ist wie folgt (3x3 statt 500x500):
%Vor%Ich möchte Folgendes als Zeichenfolgen ausgeben:
%Vor%Eine vorherige SO-Frage hatte ein ähnliches Problem mit Integer-Arrays, und die Lösung basiert auf der Summe der Array-Elemente. Aber ich arbeite mit Zeichen, also kann ich mir keine Methode ausdenken.
Denken Sie über die Koordinaten der Zellen nach:
%Vor%Für jede Diagonale haben alle Elemente etwas gemeinsam: Die Summe der Koordinaten eines Elements ist eine Konstante. Hier sind die Konstanten:
%Vor% Die minimale Konstante ist die kleinste Koordinatensumme, 0. Die maximale Konstante ist die größte Koordinatensumme. Da jede Koordinatenkomponente bis zu array.length - 1
gehen kann, ist die maximale Konstante 2 * (array.length - 1)
.
Die Sache ist also, über die Konstanten zu iterieren. Durchlaufen Sie für jede Konstante die Elemente, deren Koordinaten sich zur Konstante addieren. Dies ist wahrscheinlich der einfachste Ansatz:
%Vor% Dies führt jedoch dazu, dass über viele außerhalb liegende Koordinaten iteriert wird, da es immer über alle möglichen y
-Koordinaten iteriert, obwohl nur eine Diagonale alle möglichen y
-Koordinaten enthält. Ändern wir die y
-Schleife so, dass sie nur die y
-Koordinaten aufruft, die für die aktuelle k
benötigt werden.
Eine Bedingung für Koordinaten außerhalb der Grenzen ist x < 0
. Ersetzen Sie die Definition von x
und lösen Sie:
Wenn y > k
, x
also negativ ist. Daher wollen wir nur eine Schleife machen, solange y <= k
.
Die andere Bedingung für Koordinaten außerhalb der Grenzen ist x >= array.length
. Lösen:
Wenn y <= k - array.length
, x
also zu groß ist. Daher möchten wir y
bei 0 oder k - array.length + 1
starten, je nachdem, welcher Wert größer ist.
Hinweis: Ich habe nur diesen Code als korrekt bewiesen. Ich habe es nicht getestet.
Viel einfacher ist es, die Summe zu überprüfen, wenn die Indizes gleich dem Array sind. length = 1; für diagonalRight und für diagonalLeft überprüfe einfach, ob i gleich j ist
Beispiel:
digonalLeft Summen \ der Matrix, weil (0,0) (1,1) (2,2) die Diagonale bildet. diagonalRight summiert / von Matrix, weil (0 + 2) = (1 + 1) = (2 + 0) = 2 und 2 ist die array.length - 1.
%Vor%