ARTS
Algorithm:每周至少做一个leetcode的算法题;
Review:阅读并点评至少一篇英文技术文章;
Tip/Tech:学习至少一个技术技巧;
Share:分享一篇有观点和思考的技术文章;
Algorithm
54. 螺旋矩阵
https://leetcode-cn.com/problems/spiral-matrix/
59. 螺旋矩阵 II
https://leetcode-cn.com/problems/spiral-matrix-ii/
其实这两题整个的 思想是一样的,唯一的技巧就是你需要找到一个正确的方法来记录每次走过的节点,以及找到一个正确的退出循环的方法。
但是两题的走过的路是不一样的,第二题比第一题会简单一些,因为第二题的路线是非常工整的,就是给你一个数字,必然会有一个n*n的矩阵,你只要按照题目意思顺着走就可以了。所以这里先上第二题的代码:
int[][] matrix = new int[n][n];
if (n == 1) {
matrix[0][0] = 1;
return matrix;
}
int top = 0;
int bottom = matrix.length - 1;
int left = 0;
int right = matrix[0].length - 1;
int point = 0;
while (true) {
for (int i = left; i < right; i ++) {
matrix[top][i] = ++point ;
}
for (int i = top; i < bottom; i++) {
matrix[i][right] = ++point;
}
for (int i = right; i > left; i--) {
matrix[bottom][i] = ++point;
}
for (int i = bottom; i > top; i--) {
matrix[i][left] = ++point;
}
left++;
if (left == right) {
break;
}
top++;
if (top >= bottom) {
break;
}
right--;
if (right == left) {
matrix[left][top]= ++point;;
break;
}
bottom--;
if (bottom == top) {
break;
}
}
return matrix;
代码中可以看到有四个标点,这这些点在移动的过程中可以帮助我们来确定,下次这些点在什么时候开始逐步进行填数的。大概的路线图的就是如图所示:
从1到4;5到8;9到12;13到16。一次循环,然后内层17到18;这样以此类推。
利用代码就不难写出来了。
虽然第一题的思路是一样的,但是路线就是不是四平八稳的了,因为需要你需要一次性走到底然后进行更新下一个起点所需要的使用的坐标的节点的数值。相较而言就比较复杂了。最好还是先画一个路线图:
1到5;6到9;10到13;14到16。这样的路线虽然非主流,但是只要代码写好了,可以很好的应对第一种的复杂的情况,因为第一题会出现比如单个数组排成一列的情况。
Review
一篇对Java之爹的采访:
https://www.artima.com/intv/goslingD.html
原谅我的理解能力,我是真的没怎么看懂这个大爷的说的啥。
不过这个大爷提到Java当时被用到各种的大型操作系统中,这些个大型系统正在变得原来越臃肿,难以操作。
大爷还提到一写关于重构的理念,重构无处不在的,哪怕小到一个变量名称。
Tip/Tech
使用数据结构:队列来实现广度优先搜索
Share
Don’t Touch Anything
在一个复杂的系统中,除非你了解你的改变如何使事情变得更好,否则最好只是保持原样。