ich schreibe diese Antwort, weil auch nach der von Jason gepostet Antwort liest oben (es ist schön und ein paar Fragen haben löste ich hatte) war es noch nicht Klar für mich, welche Rolle der variable Offset in dieser Logik spielt, also ein Couple Um das zu verstehen, dachte ich, es mit allen zu teilen.
Es gibt viele Variablen hier verwendet und es ist wichtig, die Bedeutung von jedem zu verstehen.
Wenn man sich die Variable 'first' anschaut, ist sie nutzlos, sie ist im Grunde die 'Schicht' selbst, 'first' wird in der gesamten Logik überhaupt nicht verändert. Also habe ich 'erste' Variable entfernt (und es funktioniert, lesen Sie weiter).
Um zu verstehen, wie sich jeder dieser Werte in jeder Iteration der inneren for-Schleife ändert, habe ich die Werte dieser Variablen ausgedruckt. Sehen Sie sich die Ausgabe an und verstehen Sie, welche Werte sich ändern, wenn wir uns in der inneren for-Schleife von einer Ecke zur nächsten bewegen. Diese Werte bleiben konstant, während wir eine einzelne Ebene durchlaufen und welche Werte sich nur ändern, wenn wir die Ebene ändern.
Eine Iteration der inneren Schleife verschiebt einen einzelnen Block. Die Anzahl der Iterationen, die benötigt werden, um eine einzelne Ebene zu verschieben, ändert sich, wenn wir nach innen gehen. Die Variable ‚last‘ macht diesen Job für uns, es die innere Schleife begrenzt (beschränkt die innere Schicht & uns hält von jenseits der Schale gehen, aufbauend auf der Nomenklatur Jason verwendet)
Zeit die Ausgabe zu studieren.
Ich habe 6x6 Matrix verwendet.
Input:
315 301 755 542 955 33
943 613 233 880 945 280
908 609 504 61 849 551
933 251 706 707 913 917
479 785 634 97 851 745
472 348 104 645 17 273
--------------Starting an iteration of OUTER FOR LOOP------------------
--------------Starting an iteration of inner for loop------------------
layer =0
last =5
i =0
buffer = 315
offset = i-layer = 0
Current Status:
472 301 755 542 955 315
943 613 233 880 945 280
908 609 504 61 849 551
933 251 706 707 913 917
479 785 634 97 851 745
273 348 104 645 17 33
--------------Finished an iteration of inner for loop------------------
--------------Starting an iteration of inner for loop------------------
layer =0
last =5
i =1
buffer = 301
offset = i-layer = 1
Current Status:
472 479 755 542 955 315
943 613 233 880 945 301
908 609 504 61 849 551
933 251 706 707 913 917
17 785 634 97 851 745
273 348 104 645 280 33
--------------Finished an iteration of inner for loop------------------
--------------Starting an iteration of inner for loop------------------
layer =0
last =5
i =2
buffer = 755
offset = i-layer = 2
Current Status:
472 479 933 542 955 315
943 613 233 880 945 301
908 609 504 61 849 755
645 251 706 707 913 917
17 785 634 97 851 745
273 348 104 551 280 33
--------------Finished an iteration of inner for loop------------------
--------------Starting an iteration of inner for loop------------------
layer =0
last =5
i =3
buffer = 542
offset = i-layer = 3
Current Status:
472 479 933 908 955 315
943 613 233 880 945 301
104 609 504 61 849 755
645 251 706 707 913 542
17 785 634 97 851 745
273 348 917 551 280 33
--------------Finished an iteration of inner for loop------------------
--------------Starting an iteration of inner for loop------------------
layer =0
last =5
i =4
buffer = 955
offset = i-layer = 4
Current Status:
472 479 933 908 943 315
348 613 233 880 945 301
104 609 504 61 849 755
645 251 706 707 913 542
17 785 634 97 851 955
273 745 917 551 280 33
--------------Finished an iteration of inner for loop------------------
--------------Finished an iteration of OUTER FOR LOOP------------------
--------------Starting an iteration of OUTER FOR LOOP------------------
--------------Starting an iteration of inner for loop------------------
layer =1
last =4
i =1
buffer = 613
offset = i-layer = 0
Current Status:
472 479 933 908 943 315
348 785 233 880 613 301
104 609 504 61 849 755
645 251 706 707 913 542
17 851 634 97 945 955
273 745 917 551 280 33
--------------Finished an iteration of inner for loop------------------
--------------Starting an iteration of inner for loop------------------
layer =1
last =4
i =2
buffer = 233
offset = i-layer = 1
Current Status:
472 479 933 908 943 315
348 785 251 880 613 301
104 609 504 61 233 755
645 97 706 707 913 542
17 851 634 849 945 955
273 745 917 551 280 33
--------------Finished an iteration of inner for loop------------------
--------------Starting an iteration of inner for loop------------------
layer =1
last =4
i =3
buffer = 880
offset = i-layer = 2
Current Status:
472 479 933 908 943 315
348 785 251 609 613 301
104 634 504 61 233 755
645 97 706 707 880 542
17 851 913 849 945 955
273 745 917 551 280 33
--------------Finished an iteration of inner for loop------------------
--------------Finished an iteration of OUTER FOR LOOP------------------
--------------Starting an iteration of OUTER FOR LOOP------------------
--------------Starting an iteration of inner for loop------------------
layer =2
last =3
i =2
buffer = 504
offset = i-layer = 0
Current Status:
472 479 933 908 943 315
348 785 251 609 613 301
104 634 706 504 233 755
645 97 707 61 880 542
17 851 913 849 945 955
273 745 917 551 280 33
--------------Finished an iteration of inner for loop------------------
--------------Finished an iteration of OUTER FOR LOOP------------------
472 479 933 908 943 315
348 785 251 609 613 301
104 634 706 504 233 755
645 97 707 61 880 542
17 851 913 849 945 955
273 745 917 551 280 33
Sorry, aber es gibt keinen anderen Weg, als auf, darüber nachzudenken, wie die Werte der Schicht, i und Offset-Änderung zu verstehen, was zum Teufel hier geschieht.
Schließlich wird der Code
Hier ist der Code, wo ich unnötig zuerst entfernt und hinzugefügt, um die alle print-Anweisungen, im Falle, wenn jemand will, mehr spielen.Dieser Code hat auch Zufallsmatrix Initialisierung und Druck:
package com.crackingthecodinginterview.assignments.chap1;
public class Problem6RotateMatrix90 {
public static void main(String args[]){
int[][] matrix = new int[6][6];
initializeMatrix(matrix,6);
System.out.println("Input: ");
printMatrix(matrix,6);
rotate(matrix,6);
printMatrix(matrix,6);
}
public static void rotate(int[][] matrix, int n) {
for (int layer = 0; layer < n/2; ++layer) {
System.out.println("\n--------------Starting an iteration of OUTER FOR LOOP------------------");
int last = n - 1 - layer;
for(int i = layer; i < last; ++i) {
int offset = i - layer;
int buffer = matrix[layer][i]; // save top
System.out.println("\n--------------Starting an iteration of inner for loop------------------");
System.out.println("layer ="+layer);
System.out.println("last ="+last);
System.out.println("i ="+i);
System.out.println("buffer = "+buffer);
System.out.println("offset = i-layer = "+ offset);
// left -> top
matrix[layer][i] = matrix[last-offset][layer];
// bottom -> left
matrix[last-offset][layer] = matrix[last][last - offset];
// right -> bottom
matrix[last][last - offset] = matrix[i][last];
// top -> right
matrix[i][last] = buffer; // right <- saved top
//print
System.out.println("Current Status: ");
printMatrix(matrix,6);
System.out.println("--------------Finished an iteration of inner for loop------------------");
}
System.out.println("--------------Finished an iteration of OUTER FOR LOOP------------------");
}
}
public static void printMatrix(int[][] matrix,int n){
System.out.print("\n");
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
System.out.print(" "+matrix[i][j]);
}
System.out.print("\n");
}
}
public static void initializeMatrix(int[][] matrix,int n){
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
matrix[i][j]=(int) (Math.random() * 1000);
}
}
}
}
Vielen Dank für die schnelle Antwort innerhalb, Ihre Erklärung wird sehr geschätzt. Ich entschuldige mich, wenn diese Frage zu einfach ist, aber ich hatte Schwierigkeiten, in einem größeren Maßstab zu verstehen, was "links", "rechts", "oben" und "unten" waren und woraus eine "Schicht" besteht. Wären links, rechts, oben, unten nur die Eckstücke? Wäre jede Schicht nur eine Grenze des nach innen gehenden Quadrats? – JGY
Ich werde meine Antwort bearbeiten ... – Jason
@Jason Danke für die Erklärung. Ich kann die Logik hinter "int offset = i - first" nicht verstehen. in der inneren Schleife. – Ayusman