我最近在接受采访时被问到这个问题。花了好几个小时之后,我确实提出了一个单线程实现,但我觉得它效率低下,我不知道如何使它成为多线程。
这是我的实施:
public List<Integer> print(int[][] input, int row, int col) {
int n = input.length;
List<Integer> result = new ArrayList<>(n * n);
int i = row;
int j = col;
int steps = 1;
int k = 0;
while (true) {
k = steps;
while (k > 0) {
if (inBounds(i, j, n)) {
result.add(input[i][j]);
}
j++;
k--;
}
if (i > row + 4 || j > col + 4)
break;
k = steps;
while (k > 0) {
if (inBounds(i, j, n)) {
result.add(input[i][j]);
}
i++;
k--;
}
if (i > row + 4 || j > col + 4)
break;
steps++;
k = steps;
while (k > 0) {
if (inBounds(i, j, n)) {
result.add(input[i][j]);
}
j--;
k--;
}
if (i > row + 4 || j > col + 4)
break;
k = steps;
while (k > 0) {
if (inBounds(i, j, n)) {
result.add(input[i][j]);
}
i--;
k--;
}
steps++;
if (i > row + 4 || j > col + 4)
break;
}
return result;
}
boolean inBounds(int i, int j, int n) {
return (i >= 0 && i <= n - 1 && j >= 0 && j <= n - 1);
}