游戏公司面试题:Java如何实现二维逆时针旋转数组
//新建一个数组类
public class SnakeArray {
//程序入口
public static void main(String[] args) { move(8); }
public static void move(int n) {
//初始化
// 新建 n*n的二维数组 int[][] array = new int[n][n]; // left表示点左移,right表示点右移,up表示点上移,down表示点下移 int left = 1; int right = 2; int up = 3; int down = 4; // row代表起点所占位置的行数,column代表起点所占位置的列数。 // value代表起点的值。 // derection代表起点的移动方向:左移。 int row = 0; int column = n - 1; int value = 1; array[row][column] = value; int derection = left;
//主要逻辑代码
while (value <n * n) { /* * 对于n*n阶数组而言,最大值是n*n,最小值是1。 当点的值为最大值时,说明该n*n阶数组的元素已经重新被赋值了。 */ switch (derection) { case 1: // 左移后,行不变,列-1。 column--; // 可能遇到两种情况,越界或者移动之后的位置上的元素已经被重新赋值(也就是说,该位置点已经来过)。 if (column < 0) { // 情况一:越界。这个时候,点应该右移,回到原来位置,然后下移。 column++; derection = 4; continue; } else if (array[row][column] != 0) { // 情况二:已经被赋值。这个时候,点应该右移,回到原来位置,然后下移。 column++; derection = 4; continue; } break; case 2: // 右移后,行不变,列+1。 column++; // 可能遇到两种情况,越界或者移动之后的位置上的元素已经被重新赋值(也就是说,该位置点已经来过)。 if (column >= n) { // 情况一:越界。这个时候,点应该左移,回到原来位置,然后上移。 column--; derection = 3; continue; } else if (array[row][column] != 0) { // 情况二:已经被赋值。这个时候,点应该左移,回到原来位置,然后上移。 column--; derection = 3; continue; } break; case 3: // 上移后,行-1,列不变。 row--; // 可能遇到两种情况,越界或者移动之后的位置上的元素已经被重新赋值(也就是说,该位置点已经来过)。 if (row < 0) { // 情况一:越界。这个时候,点应该下移,回到原来位置,然后左移。 row++; derection = 1; continue; } else if (array[row][column] != 0) { // 情况二:已经被赋值。这个时候,点应该下移,回到原来位置,然后左移。 row++; derection = 1; continue; } break; case 4: // 下移后,行+1,列不变。 row++; // 可能遇到两种情况,越界或者移动之后的位置上的元素已经被重新赋值(也就是说,该位置点已经来过)。 if (row >= n) { // 情况一:越界。这个时候,点应该上移,回到原来位置,然后右移。 row--; derection = 2; continue; } else if (array[row][column] != 0) { // 情况二:已经被赋值。这个时候,点应该上移,回到原来位置,然后右移。 row--; derection = 2; continue; } break; } value++; array[row][column] = value; }// while语句结束处
//打印结果
for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) { System.out.print(array[i][j] + "\t"); } System.out.println(); }
}
}
控制台: