JS实现二进制矩阵中行列最长连续1序列求解
解决二进制矩阵中最长连续1序列问题(行+列方向)
你的原代码已经完成了随机矩阵的生成,但存在两个核心问题:一是只处理了行方向的连续1,完全没覆盖列方向;二是计算连续1长度的逻辑有误(用split('1')拿到的是0的片段,搞反了)。我帮你完善了代码,同时优化了逻辑的可读性和可靠性:
完善后的完整代码
// 获取行列数,默认值设为4,同时转为数字类型避免字符串问题 var cols = parseInt(prompt("input cols", 4)); var rows = parseInt(prompt("input rows", 4)); // 生成随机0/1矩阵 var arr = []; for (var i = 0; i < rows; i++) { arr[i] = []; for (var j = 0; j < cols; j++) { var rand = Math.round(Math.random() * 1); arr[i][j] = rand; } } console.log("生成的二进制矩阵:"); console.log(arr); // 封装复用函数:计算一维数组中最长连续1的长度 function getMaxConsecutiveOnes(arr) { let maxLength = 0; let currentLength = 0; for (let num of arr) { if (num === 1) { currentLength++; // 实时更新最大值 maxLength = Math.max(maxLength, currentLength); } else { // 遇到0就重置当前连续计数 currentLength = 0; } } return maxLength; } // 1. 遍历所有行,找出行方向的最长连续1 let maxRow = 0; for (let row of arr) { const currentRowMax = getMaxConsecutiveOnes(row); maxRow = Math.max(maxRow, currentRowMax); } // 2. 遍历所有列,找出列方向的最长连续1 let maxCol = 0; for (let colIndex = 0; colIndex < cols; colIndex++) { // 先提取当前列的所有元素,组成一维数组 const currentCol = []; for (let rowIndex = 0; rowIndex < rows; rowIndex++) { currentCol.push(arr[rowIndex][colIndex]); } const currentColMax = getMaxConsecutiveOnes(currentCol); maxCol = Math.max(maxCol, currentColMax); } // 取行和列方向的最大值作为最终结果 const longestSequence = Math.max(maxRow, maxCol); console.log(`最长连续1的序列长度是:${longestSequence}`);
关键优化点说明
- 复用性函数:把计算连续1长度的逻辑封装成
getMaxConsecutiveOnes,行和列的检查都能调用,避免重复代码 - 列方向处理:通过双重循环提取每一列的元素,转成一维数组后再用统一函数计算最长连续1
- 可靠的计数逻辑:逐个元素遍历计数,比字符串拆分的方式更稳妥(原代码的字符串转换会引入换行符,导致拆分逻辑出错)
- 类型转换:把prompt获取的输入转为数字类型,避免后续循环出现字符串索引的问题
内容的提问来源于stack exchange,提问作者Pohorilyi Vladislav Pagar
相关产品推荐
相关产品推荐

