热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

在JS中以最干净,最紧凑的方式对角矩阵在所有可能的方向上进行迭代

因此,我正在尝试编写一个函数,该函数可以对角地迭代任何矩阵(无论是正方

因此,我正在尝试编写一个函数,该函数可以对角地迭代任何矩阵(无论是正方形还是不正方形),并且可配置从左到右或从右到左的迭代,对角线可以迭代矩阵,并从上到下或从上到下或从上到下迭代。我确实提出了一个函数,该函数成功地沿任一对角线从左到右,从下到上对角线迭代了一个矩阵


function iterateDiagonally(matrix,main,rightToLeft,topToBottom)
{
for(let a = 0,b = matrix.length + matrix[0].length - 1; a {
let x = main ? Math.min(a,matrix.length - 1) : Math.max(0,a - matrix[0].length + 1);
let y = main ? Math.min(matrix[0].length - 1,matrix.length + 1 - a) : Math.min(a,matrix[0].length - 1);
for(let c = 0,d = Math.min(y + 1,main ? x + 1 : matrix.length - x); c {
let eX = main ? x - c : x + c;
let eY = y - c;
console.log(matrix[eX][eY]);
}
}
}
/*
1 4 7
2 5 8
3 6 9
*/
console.log("Along the main diagonal");
iterateDiagonally([[1,2,3],[4,5,6],[7,8,9]],true);
console.log("Along the antidiagonal");
iterateDiagonally([[1,false);


,但是意识到也可以使前两个参数变量变大(已经很庞大的代码)。因此,我正在寻找更干净,紧凑且效率不低的解决方案。谢谢!


我为您创建了一个非常简单的替代实现。

始终从顶部开始,并根据传入的布尔值从顶部或底部开始。然后,我们开始一个迭代循环,始终递增x,并递增或递减y。在每次迭代中,检查该点是否超出范围(这是终止条件)。然后,将该位置的值添加到结果数组。

const board = [
[1,2,3],[4,5,6],[7,8,9]
]
const pointInbounds = (x,y,board) => (
x >= 0
&& x && y >= 0
&& y )
const diagOnalTraversal= (board,bottomToTop=false) => {
let y = bottomToTop ? board.length-1 : 0,x = 0
const values = []
while(pointInbounds(x,board)) {
values.push(board[y][x])
x++
y += bottomToTop ? -1 : 1
}
return values
}
diagonalTraversal(board)

默认情况下,它将从左上角到右下角穿过木板。如果将真布尔值作为第二个参数,它将从左下角开始,然后向右遍历。

,

因此,经过多番思考,我最终完成了自己的工作。如果有人遇到相同的问题,请留在这里。它可能看起来很复杂,但是想法很简单


function iterateDiagonally(matrix,main,rightToLeft,topToBottom)
{
// Move along half of the perimeter,excluding the duplicate corner element
// a - first element of each diagonal
// b - amount of diagonals in total
for(let a = 0,b = matrix.length + matrix[0].length - 1; a {
// For the main diagonal,first move right along the x axis starting with the bottom left element,then move up the y axis
// For the antidiagonal,first move down the y axis starting with the top left element,then move right along the x axis
let x = main ? Math.min(a,matrix.length - 1) : Math.max(0,a - matrix[0].length + 1);
let y = main ? Math.min(matrix[0].length - 1,matrix.length + 1 - a) : Math.min(a,matrix[0].length - 1);
// Invert the starting position and direction of all movement
if(rightToLeft) x = matrix.length - 1 - x,y = matrix[0].length - 1 - y;
let diagOnal= [];
// Move along each diagonal
// c - element of diagonal
// d - amount of elements in diagonal in total
for(let c = 0,d = Math.min(rightToLeft ? matrix[0].length - y : y + 1,main !== rightToLeft ? x + 1 : matrix.length - x); c {
// Invert the diagonal traversal order
let iC = topToBottom !== rightToLeft ? d - 1 - c : c;
// X coordinate of the element
let eX = main !== rightToLeft ? x - iC : x + iC;
// Y coordinate of the element
let eY = rightToLeft ? y + iC : y - iC;
diagonal.push(matrix[eX][eY]);
}
console.log(diagonal.join(","));
}
}
/*
1 4 7
2 5 8
3 6 9
*/
console.log("Parallel main diagonal,left to right,bottom to top");
iterateDiagonally([[1,9]],true,false,false);
console.log("Parallel main diagonal,right to left,top to bottom");
iterateDiagonally([[1,true);
console.log("Parallel main diagonal,true);
console.log("Parallel antidiagonal,false);
console.log("Parallel antidiagonal,true);



推荐阅读
  • vue使用
    关键词: ... [详细]
  • 本文介绍了在wepy中运用小顺序页面受权的计划,包含了用户点击作废后的从新受权计划。 ... [详细]
  • 使用nodejs爬取b站番剧数据,计算最佳追番推荐
    本文介绍了如何使用nodejs爬取b站番剧数据,并通过计算得出最佳追番推荐。通过调用相关接口获取番剧数据和评分数据,以及使用相应的算法进行计算。该方法可以帮助用户找到适合自己的番剧进行观看。 ... [详细]
  • 本文介绍了闭包的定义和运转机制,重点解释了闭包如何能够接触外部函数的作用域中的变量。通过词法作用域的查找规则,闭包可以访问外部函数的作用域。同时还提到了闭包的作用和影响。 ... [详细]
  • IhaveconfiguredanactionforaremotenotificationwhenitarrivestomyiOsapp.Iwanttwodiff ... [详细]
  • 本文讨论了使用差分约束系统求解House Man跳跃问题的思路与方法。给定一组不同高度,要求从最低点跳跃到最高点,每次跳跃的距离不超过D,并且不能改变给定的顺序。通过建立差分约束系统,将问题转化为图的建立和查询距离的问题。文章详细介绍了建立约束条件的方法,并使用SPFA算法判环并输出结果。同时还讨论了建边方向和跳跃顺序的关系。 ... [详细]
  • 浏览器中的异常检测算法及其在深度学习中的应用
    本文介绍了在浏览器中进行异常检测的算法,包括统计学方法和机器学习方法,并探讨了异常检测在深度学习中的应用。异常检测在金融领域的信用卡欺诈、企业安全领域的非法入侵、IT运维中的设备维护时间点预测等方面具有广泛的应用。通过使用TensorFlow.js进行异常检测,可以实现对单变量和多变量异常的检测。统计学方法通过估计数据的分布概率来计算数据点的异常概率,而机器学习方法则通过训练数据来建立异常检测模型。 ... [详细]
  • 本文讨论了在手机移动端如何使用HTML5和JavaScript实现视频上传并压缩视频质量,或者降低手机摄像头拍摄质量的问题。作者指出HTML5和JavaScript无法直接压缩视频,只能通过将视频传送到服务器端由后端进行压缩。对于控制相机拍摄质量,只有使用JAVA编写Android客户端才能实现压缩。此外,作者还解释了在交作业时使用zip格式压缩包导致CSS文件和图片音乐丢失的原因,并提供了解决方法。最后,作者还介绍了一个用于处理图片的类,可以实现图片剪裁处理和生成缩略图的功能。 ... [详细]
  • 在编写业务代码时,常常会遇到复杂的业务逻辑导致代码冗长混乱的情况。为了解决这个问题,可以利用中间件模式来简化代码逻辑。中间件模式可以帮助我们更好地设计架构和代码,提高代码质量。本文介绍了中间件模式的基本概念和用法。 ... [详细]
  • 模板引擎StringTemplate的使用方法和特点
    本文介绍了模板引擎StringTemplate的使用方法和特点,包括强制Model和View的分离、Lazy-Evaluation、Recursive enable等。同时,还介绍了StringTemplate语法中的属性和普通字符的使用方法,并提供了向模板填充属性的示例代码。 ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • 本文介绍了在使用vue和webpack进行异步组件按需加载时可能出现的报错问题,并提供了解决方法。同时还解答了关于局部注册组件和v-if指令的相关问题。 ... [详细]
  • Redis底层数据结构之压缩列表的介绍及实现原理
    本文介绍了Redis底层数据结构之压缩列表的概念、实现原理以及使用场景。压缩列表是Redis为了节约内存而开发的一种顺序数据结构,由特殊编码的连续内存块组成。文章详细解释了压缩列表的构成和各个属性的含义,以及如何通过指针来计算表尾节点的地址。压缩列表适用于列表键和哈希键中只包含少量小整数值和短字符串的情况。通过使用压缩列表,可以有效减少内存占用,提升Redis的性能。 ... [详细]
  • 本文介绍了深入浅出Linux设备驱动编程的重要性,以及两种加载和删除Linux内核模块的方法。通过一个内核模块的例子,展示了模块的编译和加载过程,并讨论了模块对内核大小的控制。深入理解Linux设备驱动编程对于开发者来说非常重要。 ... [详细]
  • 本文介绍了如何使用Express App提供静态文件,同时提到了一些不需要使用的文件,如package.json和/.ssh/known_hosts,并解释了为什么app.get('*')无法捕获所有请求以及为什么app.use(express.static(__dirname))可能会提供不需要的文件。 ... [详细]
author-avatar
王琰杰昔凛
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有