下面是经典问题的java解决方案,即顺时针旋转nxn矩阵90度。
public void rotate(int[][] matrix, int n) {
for (int layer = 0; layer < n / 2; ++layer) {
int first = layer;
int last = n - 1 - layer;
for(int i = first; i < last; ++i) {
int offset = i - first;
// save top
int top = matrix[first][i];
// left -> top
matrix[first][i] = matrix[last-offset][first];
// bottom -> left
matrix[last-offset][first] = matrix[last][last - offset];
// right -> bottom
matrix[last][last - offset] = matrix[i][last];
// top -> right
matrix[i][last] = top;
}
}
}
下面是我尝试使用的方法: 1.理解问题陈述,假设。2.在最小的子任务中分解问题,并尝试用简单的英语写出/解释解决方案。3.编写伪代码4.编写实际代码。
我被困在#3和#4之间。我有方法,知道逻辑,但在编写解决方案的一部分方面遇到了困难。让我展示一下:
方法:给定这个nxn矩阵:
[00 01 02 03
10 11 12 13
20 21 22 23
30 31 32 33]
这个矩阵可以通过旋转突出的内外环(实际上不是圆形)旋转。外环有*。
[00* 01* 02* 03*
10* 11 12 13*
20* 21 22 23*
30* 31* 32* 33*]
现在,要旋转行和列,可以移动行的每个元素和相应的列。例如,首先在临时变量中取00。移动30代替00。移动33而不是30。移动03代替33,最后将临时分配给03。同样地,移动其他的。
现在,可以通过在0到小于len/2之间设置一个外部计数器来实现上述方法,这在解决方案中被称为层。内部计数器将介于层与层之间。很简单!
但是,我很难用粗体对这个部分进行编码。即编写下面对所有索引都有效。
// save top
// left -> top
// bottom -> left
// right -> bottom
// top -> right
例如,[]之间的事情:给了这个问题一个突破,但是在这些动态指标中的任何一个都不断地出错。我通常在嵌套/正常循环中感到舒服。
matrix[first][i] = matrix[last-offset][first];
matrix[last-offset][first] = matrix[last][last - offset];
matrix[last][last - offset] = matrix[i][last];
matrix[i][last] = top;
我知道需要做什么,但不能编写动态索引的逻辑。如对此有任何帮助,将不胜感激。解决办法是有的,但这个问题更多的是一个有益的建议。当你被困在这里时,你做了什么?
作者已经解释了上述答案,但在解释了方法之后,她也跳过了已经写好的程序。
发布于 2016-10-08 23:16:16
当你被困在这里时,你做了什么?
使用铅笔和纸,并画一些图片,以帮助可视化问题。
如果您有一个带有调试器的IDE (如果没有,原因是什么?)然后使用调试器“单步”通过问题可能也有帮助。
最终,这归结为为代码的工作方式建立了一个精确的心智模型。这不是别人能教你做的事。你只需要练习,直到你掌握了它的诀窍。先从更简单的问题/程序开始,然后再转到更复杂的问题。
https://softwareengineering.stackexchange.com/questions/333198
复制