JavaScript 遍历定序数字数组按规则生成所有两两组合的实现方案
原代码问题说明
原代码仅处理了数组最外层左右指针的配对逻辑,没有循环处理中间剩余的子数组,只能输出前两轮的结果,无法覆盖所有符合要求的组合。
实现思路
- 采用双指针法从数组两端向中间遍历,每次循环先收集左指针对应元素和其右侧到右指针所有元素的配对,再收集右指针对应元素和其左侧到左指针+1所有元素的配对
- 左右指针各向中间移动一位,重复上述操作直到左指针大于等于右指针,即可覆盖所有符合要求的组合,且顺序完全匹配示例
正确实现代码
function calculate(numbers) { const combinations = []; let l = 0; let r = numbers.length - 1; while (l < r) { // 收集左指针和右侧所有元素的配对 for (let j = l + 1; j <= r; j++) { combinations.push(`${numbers[l]} ${numbers[j]}`); } // 收集右指针和左侧(排除左指针)所有元素的配对 for (let j = r - 1; j > l; j--) { combinations.push(`${numbers[r]} ${numbers[j]}`); } l++; r--; } return combinations; }
注:如果数组元素是数字类型,
01会被JS自动转义为十进制1,如果需要保留前导零建议使用字符串类型存储数组元素。
测试验证
测试用例1(长度为5的数组)
const numbers1 = ['01','02','03','04','05']; console.log(calculate(numbers1)); /* 输出: [ '01 02', '01 03', '01 04', '01 05', '05 04', '05 03', '05 02', '04 03', '04 02', '03 02' ] */
测试用例2(长度为6的数组)
const numbers2 = ['00','00','00','10','40','60']; console.log(calculate(numbers2)); /* 输出: [ '00 00', '00 00', '00 10', '00 40', '00 60', '60 40', '60 10', '60 00', '60 00', '00 00', '00 10', '00 40', '40 10', '40 00', '00 10' ] */
内容的提问来源于stack exchange,提问作者Alexis San Martin
相关产品推荐
相关产品推荐

