刷题精选:顺时针输出递增数组(螺旋递增升天数组)

Posted bit_zhy

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了刷题精选:顺时针输出递增数组(螺旋递增升天数组)相关的知识,希望对你有一定的参考价值。

刷题精选:顺时针输出递增数组

题目描述


由上图描述,输入一个数字n,代表n行n列,之后经过函数之后顺时针的将从1到n打印出来。

算法分析

通过找规律,我们可以发现,最终的结果是一个正方形,那么我们可以联想到用一个二维数组按顺序来存储这些数字,最后输出二维数组即可,同时,这些数字是一圈一圈按照顺时针递增的,因此我们可以将这个二维数组拆开一圈一圈来看,我们画图来表示一下
以n=5为例

最后的二维数组需要储存成这个样子,那么我们可以将其分为三圈
第一圈:

第二圈:

第三圈:

我们如果按照圈来储存的话,那么他们按照顺时针存储的规律就是一样的了,即先顺序的储存最上边的一行,然后顺序的储存最右边的一列,之后再倒序的存储最下边的一行,最后倒序的存储最左边的一行,那么储存完一圈后,继续按照这个循环,每存储完一圈之后,开始行,结束行,开始列,结束列都会靠近(因为圈变小了)最后的第三圈只有一个数字,那么这个时候意味着开始行和结束行,开始列结束列已经相同了,当开始行大于结束行,开始列大于结束列时,循环结束,即二维数组储存完毕,最后直接输出二维数组即可

代码分析

import java.util.Scanner;

/**
 * Created with IntelliJ IDEA.
 * Description:
 * User: hp
 * Date: 2022-07-12
 * Time: 11:08
 */
public class Dragon 
    public static void main(String[] args) 
        Scanner scanner = new Scanner(System.in);
        int number = scanner.nextInt();
        //建立一个二维数组,储存所有的数字的顺时针版本,最后只需输出这个二维数组即可
        int[][] result= new int[number][number];
        //开始列,因为是数组因此以0开头
        int startC = 0;
        //结束列,因为是数组为了不使得下标超出因此-1
        int endC = number - 1;
        int startR = 0;
        int endR = number - 1;
        //定义计数器,记录每个位置的数字
        int count = 1;
        //每次循环过程中四个变量都会逐渐接近,当start大于end时,结束循环
        while(startC <= endC && startR <= endR)
            //先输出顶行的,顺序输出(从左向右)
            //从起始列开始,到结束列
            for (int i = startC; i <= endC; i++) 
                result[startR][i] = count;
                count++;
            
            //每一顶行输出完,下一次就是下一行了,因此startR++
            startR++;
            //输出右边一列的,顺序输出(从上到下)
            //从当时的起始行开始,因为上边循环已经输出完了顶行,因此直接从下一行开始输出
            //刚刚已经对startR++了,所以直接使得i=startR即可
            for (int i = startR; i <= endR; i++) 
                result[i][endC] = count;
                count++;
            
            //因为输出完了右边一列,右边一列意味着结束列,下一次执行这个for循环则会是
            //这一列的内部(左边)一列,因此endR--
            endC--;
            //再输出底部一行,倒序输出(从右向左),直接由当前的结束列开始
            for (int i = endC; i >= startC; i--) 
                result[endR][i] = count;
                count++;
            
            //底部一行填充完毕,因此endR--
            endR--;
            //在输出左边一列,也是从结束行开始,倒序输出(从下到上)
            for (int i = endR; i >= startR; i--) 
                result[i][startC] = count;
                count++;
            
            //左边一列填充完毕,开始列加一startC++
            startC++;
        
        //输出数组
        for (int i = 0; i < number; i++) 
            for (int j = 0; j < number; j++) 
                System.out.print(result[i][j] + " ");
            
            System.out.println();
        

以上是关于刷题精选:顺时针输出递增数组(螺旋递增升天数组)的主要内容,如果未能解决你的问题,请参考以下文章

刷题精选:顺时针输出递增数组(螺旋递增升天数组)

Java 实现顺时针螺旋二维数组输出

顺时针和逆时针螺旋打印二维数组(行列式)

螺旋矩阵

1050. 螺旋矩阵(25)

LeetCode刷题 最长递增子序列