我的做法,不知道效率怎么样- 写一方法,打印等长的二维数组,要求从1开始的自然数由方阵的最外圈向内螺旋方式地顺序排列。 如: n = 4 则打印:
- * 1 2 3 4
- * 12 13 14 5
- * 11 16 15 6
- * 10 9 8 7
- * 分析:
- * 1.等长的二维数组,new int[length][length],最大索引为length-1.此处的length为题目中的n。
- * 2.图形中的数字是递增的,范围是 1 ~ length*length
- * 3.定义变量x记录二维数组的索引,y记录一维数组的索引。x控制索引的纵向移动,y控制索引的横向移动。
- * 4.图形是由多个闭合的数字组成的长方形组合起来的。用循环语句实现,定义计数器int count记录循环的次数,每次循环结束后+1.
- * 5.第一次的起点位置是arr[0][0],以后每次循环的起点为arr[count][count]
- * 6.向右移动, x不变, y++, 自增后赋值, 循环条件为x==count&&y<length-1-count
- * 向下移动, y不变, x++, 自增后赋值, 循环条件为y==length-1-count&&x<length-1-count
- * 向左移动, x不变, y--, 自减后赋值, 循环条件为x==length-1-count&&y>count
- * 向上移动, y不变, x--, 自减后赋值, 循环条件为y==count&&x>count+1:每次循环的起点位置已经赋值,所以x>count+1
- */
- package com.itheima;
- import java.util.Scanner;
- /**
- * 9、 写一方法,打印等长的二维数组,要求从1开始的自然数由方阵的最外圈向内螺旋方式地顺序排列。 如: n = 4 则打印:
- * 1 2 3 4
- * 12 13 14 5
- * 11 16 15 6
- * 10 9 8 7
- *
- * @author 面具
- *
- */
- public class Test9 {
- public static void main(String[] args) {
- System.out.println("请输入二维数组的长度,");
- // 获取键盘录入的数字
- @SuppressWarnings("resource")
- Scanner sc = new Scanner(System.in);
- int length = sc.nextInt();
- // 定义二维数组,接收赋值后的等长二维数组
- int[][] arr = method(length);
- // 调用方法遍历二维数组
- printArr(arr);
- }
- /**
- * @param arr
- * 接收一个需要遍历的二维数组
- */
- public static void printArr(int[][] arr) {
- // 外层循环遍历二维数组中的一维数组
- for (int x = 0; x < arr.length; x++) {
- // 内循环遍历一维数组中的元素
- for (int y = 0; y < arr[x].length; y++) {
- // 打印元素
- System.out.print(arr[x][y] + "\t");
- }
- System.out.println();
- }
- }
- /**
- * @param length
- * 接收一个int型变量,该变量为二维数组的长度
- * @return 返回赋值后的二维数组
- */
- public static int[][] method(int length) {
- // 定义一个等长二维数组
- int[][] arr_1 = new int[length][length];
- // 定义变量记录二维数组的中一位数组的值
- int num = 1;
- // 定义变量记录循环的次数
- int count = 0;
- // 循环语句,控制条件为num<=length*length
- while (num <= (length * length)) {
- // 定义变量记录二维数组的索引值
- int i = count;
- // 定义变量记录一维数组的索引值
- int j = count;
- // 给每次循环的起点赋值
- arr_1[i][j] = num++;
- // 向右移动,i不变, j++
- while (i == count && j < length - 1 - count) {
- // 一维数组索引自增
- j++;
- arr_1[i][j] = num++;
- }
- // 向下移动,j不变,i++
- while (j == length - 1 - count && i < length - 1 - count) {
- // 二维数组索引自增
- i++;
- arr_1[i][j] = num++;
- }
- // 向左移动,i不变,j--
- while (i == length - 1 - count && j > count) {
- // 一维数组索引自减
- j--;
- arr_1[i][j] = num++;
- }
- // 向上移动,j不变,i--
- while (j == count && i > count + 1) {
- // 二维数组索引自减
- i--;
- arr_1[i][j] = num++;
- }
- count++;
- }
- return arr_1;
- }
- }
复制代码
|