输入一个矩阵,按照从外向里依顺序一次打印

2023-11-09

输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,
例如,如果输入如下4 X 4矩阵: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 
则依次打印出数字1,2,3,4,8,12,16,15,14,13,9,5,6,7,11,10.

解法一:

int[][] matrix = {{1, 2, 3, 4}, {5, 6, 7, 8}, {9, 10, 11, 12}, {13, 14, 15, 16}};
        //int[][] matrix=new int[0][0];
        System.out.println(printMatrix(matrix));
        ArrayList<Integer> integers = new ArrayList<>();
        for (int i = 0; i < (matrix.length + 1) / 2; i++) {
            for (int j = i; j < matrix[i].length - i; j++) {
                integers.add(matrix[i][j]);
            }
            for (int k = i + 1; k < matrix.length - i; k++) {
                integers.add(matrix[k][matrix[i + 1].length - 1 - i]);
            }
            for (int m = matrix[matrix.length - i - 1].length - i - 2; m >= i; m--) {
                integers.add(matrix[matrix.length - i - 1][m]);
            }
            for (int n = matrix.length - i - 2; n > i; n--) {
                integers.add(matrix[n][i]);
            }
        }
        System.out.println(integers);

原理:用外层循环控制循环次数,内层循环控制指针指向的位置;首先从左至右横向打印i从零号未开始打印至最后一个即从i打印至第一个一维数组元素索引下标减i;然后纵向从上而下打印,第一个元素未从左至右横向打印的最后一个元素,所以总向打印应该从第二个元素开始,即为二位数组第二行最后一个元素,依次纵向打印即为:第k行(第k个一维数组)中的最后一个元素;然后则是从右向左打印,第一次循环即为最后一行元素倒叙打印,与上同理第一个元素以纵向打印,所以从第二个元素打印即可;最后从下而上纵向打印与上不同之处为第一个元素以及最后一个元素都已打印过,只需要打印中间部分其索引号空间为:二位数组总长度减1再减1,第一个减一是因为,索引号从零开始,第二个减一是因为最后一个元素已打印过,减i是为了避免上一次打印过的再次打印;用二位数组减i是为了确保每一次指针都指向每一次循环的最外层。

解法二:

package matrix;

import org.testng.annotations.AfterTest;

import java.util.ArrayList;

public class Matrix4 {
    public static void main(String[] args) {
        int[][] matrix = {{1, 2, 3, 4}, {5, 6, 7, 8}, {9, 10, 11, 12}, {13, 14, 15, 16}};
       
        System.out.println(printMatrix(matrix));

    }

    //@Test
    public static ArrayList<Integer> printMatrix(int[][] matrix) {
        ArrayList<Integer> res = new ArrayList<Integer>();
        int m = matrix.length;
        if (m == 0)
            return res;
        int n = matrix[0].length;
        boolean[][] visted = new boolean[m][n];
        for (int i = 0; i < ((m + 1) / 2); i++) {
            for (int top = 0; top < n; top++)
                if (!visted[i][top]) {
                    res.add(matrix[i][top]);
                    visted[i][top] = true;
                }
            for (int right = 0; right < m && (n - 1 - i) >= 0; right++)
                if (!visted[right][n - 1 - i]) {
                    res.add(matrix[right][n - 1 - i]);
                    visted[right][n - 1 - i] = true;
                }
            for (int button = n - 1; button >= 0 && (m - 1 - i) >= 0; button--)
                if (!visted[m - 1 - i][button]) {
                    res.add(matrix[m - 1 - i][button]);
                    visted[m - 1 - i][button] = true;
                }
            for (int left = m - 1; left >= 0 && i < n; left--)
                if (!visted[left][i]) {
                    res.add(matrix[left][i]);
                    visted[left][i] = true;
                }
        }
        return res;
    }
}

原理:首先根据所列出的矩阵求取出总的二位数组长度,以及内部一维数组长度,即矩阵的长与宽;然后同步生成一个boolean型的同大小矩阵,其默认值为false,没打印一个元素就把对应位置的boolea值修改为true,每一次打印判断该位置的值是否为false,如果不是false,则自加一指向下一个元素知道为false则打印

package matrix;

import org.testng.annotations.AfterTest;

import java.util.ArrayList;

public class Matrix4 {
    public static void main(String[] args) {
        int[][] matrix = {{1, 2, 3, 4}, {5, 6, 7, 8}, {9, 10, 11, 12}, {13, 14, 15, 16}};
        //int[][] matrix=new int[0][0];
        System.out.println(printMatrix(matrix));
        ArrayList<Integer> integers = new ArrayList<>();
        for (int i = 0; i < (matrix.length + 1) / 2; i++) {
            for (int j = i; j < matrix[i].length - i; j++) {
                integers.add(matrix[i][j]);
            }
            for (int k = i + 1; k < matrix.length - i; k++) {
                integers.add(matrix[k][matrix[i + 1].length - 1 - i]);
            }
            for (int m = matrix[matrix.length - i - 1].length - i - 2; m >= i; m--) {
                integers.add(matrix[matrix.length - i - 1][m]);
            }
            for (int n = matrix.length - i - 2; n > i; n--) {
                integers.add(matrix[n][i]);
            }
        }
        System.out.println(integers);
    }

    //@Test
    public static ArrayList<Integer> printMatrix(int[][] matrix) {
        ArrayList<Integer> res = new ArrayList<Integer>();
        int m = matrix.length;
        if (m == 0)
            return res;
        int n = matrix[0].length;
        boolean[][] visted = new boolean[m][n];
        for (int i = 0; i < ((m + 1) / 2); i++) {
            for (int top = 0; top < n; top++)
                if (!visted[i][top]) {
                    res.add(matrix[i][top]);
                    visted[i][top] = true;
                }
            for (int right = 0; right < m && (n - 1 - i) >= 0; right++)
                if (!visted[right][n - 1 - i]) {
                    res.add(matrix[right][n - 1 - i]);
                    visted[right][n - 1 - i] = true;
                }
            for (int button = n - 1; button >= 0 && (m - 1 - i) >= 0; button--)
                if (!visted[m - 1 - i][button]) {
                    res.add(matrix[m - 1 - i][button]);
                    visted[m - 1 - i][button] = true;
                }
            for (int left = m - 1; left >= 0 && i < n; left--)
                if (!visted[left][i]) {
                    res.add(matrix[left][i]);
                    visted[left][i] = true;
                }
        }
        return res;
    }
}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

输入一个矩阵,按照从外向里依顺序一次打印 的相关文章

  • Matlab中的矩阵合并操作

    Matlab中的矩阵合并操作 矩阵是Matlab中最常用的数据结构之一 矩阵合并也是一个十分实用的操作 本文将介绍在Matlab中如何进行矩阵合并 并提供相应的源代码 在Matlab中 可以用方括号 来表示一个矩阵 矩阵合并可以分为横向合并
  • c语言——矩阵运算器

    话不多说 上代码 include
  • 线性代数的本质(九)——二次型与合同

    文章目录 二次型与合同 二次型与标准型 二次型的分类 度量矩阵与合同 二次型与合同 二次型与标准型 Grant 二次型研究的是二次曲面在不同基下的坐标变换 由解析几何的知识 我们了解到二次函数的一次项和常数项只是对函数图像进行平移 并不会改
  • R语言绘图:实现数据点的线性拟合,进行显著性分析(R-squared、p-value)、添加公式到图像

    最近在做关于数据点线性拟合相关的研究 感觉R语言在这方面很方便 而且生成的图片很漂亮 所以在这里和大家分享一下代码 这是别人所绘制的拟合图像 很漂亮 自己也用iris鸢尾花数据集进行一个线性拟合看看 拟合线性模型最基本的函数就是lm 格式为
  • 稀疏技术——使用MATLAB编写

    稀疏技术 使用MATLAB编写 导读 核心思想 具体代码 结果 导读 本文源于武老师电力系统仿真课程的其中一个作业 了解 SPICE的同学可能知道SPICE SimulationProgram with Integrated Circuit
  • 【MATLAB】字符串的处理及矩阵的初步学习

    欢迎访问我的个人网站 reality2ideal xyz 内容在CSDN和个人网站上同步更新 字符串处理 字符串矩阵 gt gt ch 123456 qwerty ch 2 6 char 数组 123456 qwerty 字符串矩阵的列数要
  • 问题 D: 稀疏矩阵类型判断

    题目描述 输入一个稀疏矩阵 输出其类型 类型包括 上三角 对角线及其右上方的元素非0 其它元素为0 下三角 对角线及其左下方的元素非0 其它元素为0 对称 沿对角线对称的元素非0且相等 空矩阵 所有元素都为0 其它为普通矩阵 输入 输入包括
  • numpy生成等差等比数列

    文章目录 arange linspace logspace arange numpy arange start stop step dtype None 功能 Return evenly spaced values within a giv
  • GPU编程 CUDA C++ 线性代数求解器 cuSolver库

    cuSolver库较cuBLAS库更为高级 其能处理矩阵求逆 矩阵对角化 矩阵分解 特征值计算等问题 cuSolver库的实现是基于cuBLAS库和cuSPARSE库这两个基本库 cuSolver库的功能类似于Fortran中的LAPACK
  • 逆矩阵的算法

    花了10分钟 终于明白矩阵的逆到底有什么用 首先 我们先来看看这个数的倒数 倒数 其实矩阵的逆矩阵也跟倒数的性质一样 不过只是我们习惯用A 1表示 问题来了 既然是和倒数的性质类似 那为什么不能写成1 A 其实原因很简单 主要是因为矩阵不能
  • numpy基本矩阵操作

    矩阵乘法 numpy当中常用的矩阵乘法有两种 numpy dot和numpy matmul 当对象是2D矩阵的时候 这两个函数都是进行最正常的矩阵乘法 import numpy as np a np array 1 2 3 4 b np a
  • 矩阵的分解——LU分解

    LU分解 LU分解是矩阵分解的一种 将一个矩阵分解为一个下三角矩阵和一个上三角矩阵的乘积 有时需要再乘上一个置换矩阵 LU分解可以被视为高斯消元法的矩阵形式 在数值计算上 LU分解经常被用来解线性方程组 且在求逆矩阵和计算行列式中都是一个关
  • matlab 计算点云中值

    目录 一 概述 1 算法概述 2 主要函数 二 代码示例 三 结果展示 四 参数解析 输入参数 输出参数 五 参考链接 本文由CSDN点云侠原创 原文链接 如果你不是在点云侠的博客中看到该文章 那么此处便是不要脸的爬虫 一 概述
  • MATLAB小技巧(20)矩阵分析--主成分回归

    MATLAB小技巧 20 矩阵分析 主成分回归 前言 一 MATLAB仿真 二 仿真结果 三 小结 前言 MATLAB进行图像处理相关的学习是非常友好的 可以从零开始 对基础的图像处理都已经有了封装好的许多可直接调用的函数 这个系列文章的话
  • Herriott池的建模

    摘要 在气体光谱学中 为了获得足够灵敏的吸收测量 通常要求具有较长的光程长度 充气体积包裹在反射镜之间的多通道单元是满足这一要求的一种方式 同时在途中控制光束发散 避免了对超大设备的需求 Herriott单元是这种系统的一个例子 其特点是使
  • 《VirtualLab Fusion物理光学实验教程》好书分享

    目录 第一章 物理光学概念介绍 6 1 1 几何光学和光线追迹 6 1 2 物理光学和光场追迹 6 1 3 电场 磁场以及坡印廷矢量 8 1 4 振幅 相位及实部和虚部 9 1 5 振幅 相位与偏振 10 1 6菲涅尔公式 11 1 7 全
  • Latex公式中矩阵的方括号和圆括号表示方法

    一 背景 在使用Latex写论文时 不可避免的涉及到矩阵公式 有的期刊要求矩阵用方括号 有的期刊要求矩阵用圆括号 因此 特记录一下Latex源码在两种表示方法上的区别 以及数组和方程组的扩展 二 矩阵的方括号表示 首先所有的矩阵肯定都是在标
  • LeetCode-数组-矩阵问题-中等难度

    toc 矩阵 矩阵是二维数组相关的应用题型 常见的有矩阵水平翻转 矩阵对角线翻转 矩阵遍历等 1 重塑矩阵 1 1 题目描述 leetcode跳转 566 重塑矩阵 1 2 方法一 简单模拟 借助一个一维数组用来保持按行列遍历的结果 然后再
  • 华为OD机试真题-螺旋数字矩阵-2023年OD统一考试(C卷)

    题目描述 疫情期间 小明隔离在家 百无聊赖 在纸上写数字玩 他发明了一种写法 给出数字 个数n 和 行数m 0 lt n 999 0 lt m 999 从左上角的1开始 按照 顺时针螺旋向内写 方式 依次写出2 3 n 最终形成一个 m行矩
  • 矩阵基本操作

    问题描述 已知一个n n的矩阵 方阵n lt 100 把矩阵主副对角线上的元素值加上x 然后输出这个新矩阵 输入格式 一行两个变量 用空格隔开 代表n和x 接下来的n行每行n列 表示矩阵的数值 用空格隔开 输出格式 输出新矩阵 每个数字5个

随机推荐

  • C51教程 第三个51程序:数码管显示

    keil proteus 第三个51程序 让数码管循环显示0 9 这是一个AT89c51单片机教程 我们每次都会提供博文教程以及附带资料下载 单片机就是一个小型CPU 在电子领域应用广泛 电视 冰箱 洗衣机 空调等产品中都能见到他们的身影
  • 【C语言】让你不再害怕指针——C指针详解(经典,非常详细)

    目录 前言 复杂类型说明 一 细说指针 1 指针的类型 2 指针所指向的类型 3 指针的值 或者叫指针所指向的内存区或地址 4 指针本身所占据的内存区 二 指针的算术运算 三 运算符 和 四 指针表达式 五 数组和指针的关系 六 指针和结构
  • GPT专业应用:如何让GPT策划方案

    身为一名职场打工人 或多或少会面临需要写策划案的难题 不管是策划一场线下活动 还是策划业务发展的方向 甚至到生活中还需要策划婚礼 策划房屋装修 策划和朋友的聚会等等 那么如何快速积累经验 找准方向便成为了不可或缺的技能 在这里 我们将介绍如
  • python输出最长字符串_使用Python打印最长的字母子字符串,并打结...

    我将通过以下方式解决该问题 gt 让我们定义两个字符串 当前字母递增的字符串和当前最长的字符串 gt 两个字符串都以第一个字母初始化 这样我们就可以随时阅读他们的最后一封信 gt 然后遍历输入字符串s 从第二个字符开始 gt 如果当前字符c
  • 合并两个有序单链表(Java)

    思想 准备两个链表l1和l2 判断是否有链表为空 如果l1为空 则不用比较直接返回l2 如果l1为空 则直接返回l2 比较l1和l2节点 选出最小的那个节点 将该节点设为合并后的链表的head 头 节点 同时将指向该节点的l1或l2后移 方
  • 广告投放算法:受众行为分析与人群定向

    引言 物以类聚 人以群分 这句古语不仅揭示了物与人的自组织趋向 更隐含了 聚类 和 人群 之间的内在联系 例如在现代数字广告投放系统中 最为关键的 人群定向 功能正是通过 聚类 算法得以实现的 如果您厌倦了隔靴搔痒的空大宣传 不妨就随笔者一
  • 微信支付服务端开发总结

    原文链接 http blog csdn net baple article details 68059283 前言 最近应公司业务需求 把微信支付完成了 当然已经顺利上线 但是开发的过程是也是踩了很多坑 下面我就先说说开发流程 以及在开发中
  • Kotlin泛型的型变之路

    一 JAVA泛型的协变 简而言之 协变就是 如果A是B的子类 那么Generic a 就是Generic 实际上就是List a
  • SMT精密电阻对照表

    SMT 精密电阻对照表 代码 阻值 代码 阻值 代码 阻值 代码 阻值 01 100 27 187 53 348 79 649 02 102 28 191 54 357 80 665
  • head first 设计模式:策略模式

    策略模式 定义了算法族 分别封装起来 让他们之间可以互相替换 此模式让算法的变化独立于使用算法的客户 差不多应该是不固定模块的分离 当涉及 维护 时 为了 复用 reuse 目的而使用继承 结局并不完美 设计原则 找出应用中可能需要变化之外
  • CMOS图像传感器——了解光圈

    在之前有提到传感器英寸 也提到了曝光三要素之一的ISO 这里主要说明另外一个曝光三要素 光圈 在本文中 我们将介绍光圈及其工作原理 一 什么是光圈 光圈可以定义为镜头中的开口 光线通过该开口进入相机 类比眼睛是的工作原理 就容易理解了 当人
  • Java定时任务调度工具详解之Timer篇(初级)Timer函数的综合应用

    一 通过模拟两个机器人的定时行为来加深对Timer相关函数的理解 实现两个机器人第一个机器人会隔两秒打印最近一次计划的时间 执行内容 第二个机器人会模拟往桶里倒水 知道桶里的水满为止 代码示例 DancingRobot类 package c
  • ImageMagick 安装教程

    1 双击打开 ImageMagick exe 2 先点 I acccept 再点四次 Next 切记不要修改安装路径 3 默认勾选前两个 点Next 4 点Install 安装即可 之后点Next Finish就安装完了
  • 2022年“网络安全”赛项浙江省宁波市选拔赛任务书

    2022浙江省宁波市 网络安全 项目比赛任务书 A模块基础设施设置 安全加固 200分 A 1 登录安全加固 windows linux A 2 数据库加固 Linux A 3服务加固 SSH VSFTPD Linux A 4防火墙策略 L
  • student1和student2 和teacher 类,多线程问题

    参照例15 7 编写一个Java应用程序 要求有student1 student2和teacher 3个线程 其中 student1准备睡10分钟后再开始上课 student2准备睡1小时后再开始上课 teacher在输出3句 上课 后吵醒
  • 聊聊区块链--如何投资数字货币

    想知道更多关于区块链技术知识 请百度 链客区块链技术问答社区 链客 有问必答 未经允许 拒绝转载 https www liankexing com note note page id 7071 html 1 比特币 bitcoin 比特币是
  • Unity Fixed Joint 固定关节组件详解

    Chinar blog www chinar xin Unity物理引擎 Fixed Joint 固定关节 本文提供全流程 中文翻译 Chinar 的初衷是将一种简单的生活方式带给世人 使有限时间 具备无限可能 Chinar 心分享 心创新
  • bash脚本-----在耗时任务中显示旋转器动画

    1 bin bash sleep 5 pid frames while kill 0 pid 2 gt 1 gt dev null do for frame in frames do printf r frame Loading sleep
  • C++课设-学生信息管理系统

    前言 上学期的一个简单的C 课设项目 代码在后面 附github项目链接 一 问题描述 建立学生信息数据 包括学号 姓名 性别 三科成绩 出生时间 年龄 必须计算得到 使用继承的方法构造至少3个类 即学生类 虚基类 一年级学生和二年级学生类
  • 输入一个矩阵,按照从外向里依顺序一次打印

    输入一个矩阵 按照从外向里以顺时针的顺序依次打印出每一个数字 例如 如果输入如下4 X 4矩阵 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 则依次打印出数字1 2 3 4 8 12 16 15 14 13