面试题 20

本文详细介绍了如何使用Java语言实现一个算法,用于输入任意矩阵并按照从外向里以顺时针顺序打印出每一个数字。通过确定需要打印的圈、如何打印每一圈以及逻辑判断来确保所有圈已打印完成。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1 题目描述

输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字。


2 解法描述

这里写图片描述

  • 确定需要打印的圈
  • 如何打印每一圈

设定每一圈的开始 row_start 和结束行 row_end,设定每一圈的开始 col_start 和结束列 col_end。如果以下逻辑判断成立,那么所有的圈已经打印完成

!(col_start<=col_end&&row_start<=row_end)

3 java 语言实现

public class PrintMatrix {
    static void printMatrix(int[][] numbers,int rows,int columns){
        int col_start=0;
        int col_end=columns-1;
        int row_start=0;
        int row_end=rows-1;
        if(numbers==null||rows<=0||columns<=0){
            throw new RuntimeException("非法输入");
        }
        while(col_start<=col_end&&row_start<=row_end){
            //打印这一圈        
            printCircle(col_start,col_end,row_start,row_end,numbers);
            col_start++;
            col_end--;
            row_start++;
            row_end--;
        }
    }
    static void printCircle(int cs,int ce,int rs,int re,int[][] numbers){
        int tempcs=cs;
        int tempce=ce;
        int temprs=rs;
        int tempre=re;
        //打印上面一行,行不变,列数递增
        while(tempcs<=ce){
            System.out.print(numbers[rs][tempcs++]);
        }
        //打印右边一列,列不变,行数递增
        while(++temprs<=re){
            System.out.print(numbers[temprs][ce]);
        }
        //打印下面一行,行不变,列数递增  cs!=ce 防止重复打印行
        while(rs!=re&&--tempce>=cs){
            System.out.print(numbers[re][tempce]);
        }
        //打印左面一列,列不变,行数递增  cs!=ce 防止重复打列
        while(cs!=ce&&--tempre>rs){
            System.out.print(numbers[tempre][cs]);
        }
        System.out.println();
    }
    public static void main(String[] args) {
            int a1[][]={{1,2,3}, {4,5,6}, {7,8,9}};
            int a2[][]={{1,2,3}};
            int a3[][]={{1},{2},{3}};
            int a4[][]={{1}};
            int a5[][]=null;
            int a6[][]={{1,2,3}, {4,5,6}, {7,8,9},{10,11,12}};
            int a7[][]={{1,2,3,4}, {5,6,7,8}, {9,10,11,12}};
            printMatrix(a7,3,4);
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值