如何按规则分割含5个数字的已排序数组?
解决已排序5元素数组的分组问题
我来帮你搞定这个分组需求!首先咱们明确下规则(结合你给的例子):
- 对于已排序的5个数字数组,只要存在连续的3个相同数字,就把这3个归为一组,剩下的每个数字单独成单元素数组;
- 如果没有连续3个相同的数字,所有数字都各自成单元素数组。
你的原代码问题在于:用for循环每次i递增1,处理完一组3个元素后,会继续检查下一个位置的元素,导致重复分组,而且没考虑到数组末尾的边界情况(比如i+2超出数组长度)。
可行的解决方案代码
这里用while循环手动控制遍历指针,避免重复处理,同时处理边界:
function groupSortedArray(table) { const grouped = []; let i = 0; const length = table.length; while (i < length) { // 检查当前位置开始是否有连续3个相同元素(确保不越界) if (i + 2 < length && table[i] === table[i+1] && table[i] === table[i+2]) { // 截取3个元素作为一组 grouped.push(table.slice(i, i + 3)); i += 3; // 跳过已处理的3个元素 } else { // 单个元素成组 grouped.push([table[i]]); i += 1; } } return grouped; }
测试验证
咱们用你给的例子测试下:
- 输入
[1,1,1,1,1]→ 输出[[1,1,1],[1],[1]]✅ - 输入
[1,2,2,2,6]→ 输出[[1],[2,2,2],[6]]✅ - 输入
[1,2,2,4,5]→ 输出[[1],[2],[2],[4],[5]]✅ - 输入
[1,1,1,2,2]→ 输出[[1,1,1],[2],[2]]✅ - 输入
[1,1,2,2,2]→ 输出[[1],[1],[2,2,2]]✅
代码逻辑说明
- 因为数组是已排序的,相同元素必然连续,所以只需检查当前位置开始的三个元素是否相同;
- 用
i + 2 < length确保不会越界访问数组; - 处理完一组3个元素后,直接让
i +=3跳过已处理的元素,避免重复分组; - 剩下不足3个的元素,逐个单独成组。
内容的提问来源于stack exchange,提问作者Peter B.
相关产品推荐
相关产品推荐

