利用JavaScript实现蛇形矩阵

2024-06-08 04:18
文章标签 java 实现 script 矩阵 蛇形

本文主要是介绍利用JavaScript实现蛇形矩阵,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

利用JavaScript实现蛇形矩阵

输入:5

输出:[ [1, 2, 3, 4, 5],

            [16,17,18,19,6],

            [15,24,25,20,7],

            [14,23,22,21,8],

            [13,12,11,10,9] ]

之前面试遇到这道题了,当时没有编出来,然后一直没时间尝试,今天终于抽空补上了,欠的债终于还了(小声BB)

言归正传,如给定示例,数字按照顺时针旋转填充,故可以观察出该矩阵通过旋转n圈填满整个二维矩阵。

所以我们想要填满一个num*num的二维矩阵,需要计算出旋转多少圈,然后推算出每一圈上二维数组的索引规律与元素值变化规律。代码如下: 

function snakeMatrix(num) {var row = num,col = row;var q = Math.ceil(num / 2);    // 旋转几圈// 创建存放的数组var result = new Array(row);for(var i=0;i<row;i++){result[i] = new Array(col);}var n = 0;  // 第n+1圈var begin = 1;  // 每一圈起始值// 第n+1圈top,right,bottom,left值// 难点在于找到每一边上二维数组的索引变化规律// top的索引值  result[n][n+i]// bottom索引值    result[row-1-n][col-1-n-i]// right、left类似// right索引  result[n+i][col-1-n]// left索引   result[row-1-n-i][n]while(n <= q){var top = col - 2 * n; for (var i = 0; i < top; i++) {result[n][i+n] = begin + i;}var right = row - 2 * n;for (var i = 0; i < right; i++) {result[i+n][col-n-1] = begin + top + i -1;}var bottom = col - 2 * n;for (var i = 0; i < bottom; i++) {result[row-n-1][col-n-i-1] = begin + top + right + i - 2;}var left = row - 2 * n - 1;for (var i = 0; i < left; i++) {result[row-i-n-1][n] = begin + top + right + bottom + i - 3;}begin += top + right + bottom + left - 3;n++;}return result;
}
console.log(snakeMatrix(5));
// [ [ 1,  2,  3,  4,  5 ],
//   [ 16, 17, 18, 19, 6 ],
//   [ 15, 24, 25, 20, 7 ],
//   [ 14, 23, 22, 21, 8 ],
//   [ 13, 12, 11, 10, 9 ] ]

蛇形矩阵变形

输入:[ [1, 2, 3, 4, 5],

            [6, 7, 8, 9, 10],

            [11,12,13,14,15],

            [16,17,18,19,20],

            [21,22,23,24,25] ]

输出:[ [1,  2,  3,  4,  5],
                        [10,15,19,25,24],
                        [23,22,21,16,11],
                        [6,  7,  8,  9,  14],
                        [19,18,17,12,13]]

function printMatrix(matrix)
{var row = matrix.length;var col = matrix[0].length;var q = Math.ceil(row / 2);var left = 0;var top = 0;var right = col - 1;var bottom = row - 1;var result = [];while(top <= bottom && left <= right){// topfor(var i=left;i<=right;i++){result.push(matrix[top][i]);}// rightfor(var i=top+1;i<=bottom;i++){result.push(matrix[i][right]);}// bottomif(top != bottom){for(var i=right-1;i>=left;i--){result.push(matrix[bottom][i]);}}// leftif(left != right){for(var i=bottom-1;i>top;i--){result.push(matrix[i][left]);}}top++;right--;bottom--;left++;}return result;
}
var arr2 = [[1,2,3,4,5],[6,7,8,9,10],[11,12,13,14,15],[16,17,18,19,20],[21,22,23,24,25]];
console.log(printMatrix(arr2)); // [1,2,3,4,5,10,15,19,25,24,23,22,21,16,11,6,7,8,9,14,19,18,17,12,13]

 

这篇关于利用JavaScript实现蛇形矩阵的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1041183

相关文章

C#借助Spire.XLS for .NET实现在Excel中添加文档属性

《C#借助Spire.XLSfor.NET实现在Excel中添加文档属性》在日常的数据处理和项目管理中,Excel文档扮演着举足轻重的角色,本文将深入探讨如何在C#中借助强大的第三方库Spire.... 目录为什么需要程序化添加Excel文档属性使用Spire.XLS for .NET库实现文档属性管理Sp

Python+FFmpeg实现视频自动化处理的完整指南

《Python+FFmpeg实现视频自动化处理的完整指南》本文总结了一套在Python中使用subprocess.run调用FFmpeg进行视频自动化处理的解决方案,涵盖了跨平台硬件加速、中间素材处理... 目录一、 跨平台硬件加速:统一接口设计1. 核心映射逻辑2. python 实现代码二、 中间素材处

Java方法重载与重写之同名方法的双面魔法(最新整理)

《Java方法重载与重写之同名方法的双面魔法(最新整理)》文章介绍了Java中的方法重载Overloading和方法重写Overriding的区别联系,方法重载是指在同一个类中,允许存在多个方法名相同... 目录Java方法重载与重写:同名方法的双面魔法方法重载(Overloading):同门师兄弟的不同绝

Spring配置扩展之JavaConfig的使用小结

《Spring配置扩展之JavaConfig的使用小结》JavaConfig是Spring框架中基于纯Java代码的配置方式,用于替代传统的XML配置,通过注解(如@Bean)定义Spring容器的组... 目录JavaConfig 的概念什么是JavaConfig?为什么使用 JavaConfig?Jav

Java数组动态扩容的实现示例

《Java数组动态扩容的实现示例》本文主要介绍了Java数组动态扩容的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录1 问题2 方法3 结语1 问题实现动态的给数组添加元素效果,实现对数组扩容,原始数组使用静态分配

Java中ArrayList与顺序表示例详解

《Java中ArrayList与顺序表示例详解》顺序表是在计算机内存中以数组的形式保存的线性表,是指用一组地址连续的存储单元依次存储数据元素的线性结构,:本文主要介绍Java中ArrayList与... 目录前言一、Java集合框架核心接口与分类ArrayList二、顺序表数据结构中的顺序表三、常用代码手动

JAVA项目swing转javafx语法规则以及示例代码

《JAVA项目swing转javafx语法规则以及示例代码》:本文主要介绍JAVA项目swing转javafx语法规则以及示例代码的相关资料,文中详细讲解了主类继承、窗口创建、布局管理、控件替换、... 目录最常用的“一行换一行”速查表(直接全局替换)实际转换示例(JFramejs → JavaFX)迁移建

Spring Boot Interceptor的原理、配置、顺序控制及与Filter的关键区别对比分析

《SpringBootInterceptor的原理、配置、顺序控制及与Filter的关键区别对比分析》本文主要介绍了SpringBoot中的拦截器(Interceptor)及其与过滤器(Filt... 目录前言一、核心功能二、拦截器的实现2.1 定义自定义拦截器2.2 注册拦截器三、多拦截器的执行顺序四、过

Python实现快速扫描目标主机的开放端口和服务

《Python实现快速扫描目标主机的开放端口和服务》这篇文章主要为大家详细介绍了如何使用Python编写一个功能强大的端口扫描器脚本,实现快速扫描目标主机的开放端口和服务,感兴趣的小伙伴可以了解下... 目录功能介绍场景应用1. 网络安全审计2. 系统管理维护3. 网络故障排查4. 合规性检查报错处理1.

JAVA线程的周期及调度机制详解

《JAVA线程的周期及调度机制详解》Java线程的生命周期包括NEW、RUNNABLE、BLOCKED、WAITING、TIMED_WAITING和TERMINATED,线程调度依赖操作系统,采用抢占... 目录Java线程的生命周期线程状态转换示例代码JAVA线程调度机制优先级设置示例注意事项JAVA线程