Java中将数组切割为指定数量k个subarray子数组的问题修复
问题根因
你当前的代码逻辑是先固定每个子数组的最大长度为 chunks = Math.ceil(数组长度/k),再按这个长度反向计算拆分的段数,这个逻辑只能保证子数组数量≤k,无法保证刚好等于k。
举你给出的示例:数组长度为7,k=5,计算得到的chunks为2,按步长2遍历数组只能得到4个起点,最终返回4个子数组,自然不符合要求。
修复方案
要实现严格返回k个子数组,通用的拆分规则是:
- 先计算基础长度
base = arr.length / k - 再计算余数
remain = arr.length % k - 前
remain个子数组长度为base + 1,剩余k - remain个子数组长度为base,刚好凑齐k个,所有元素无遗漏也不会重复。
修复后代码
public static int[][] slice(int[] arr, int k) { int arrLength = arr.length; // 边界处理:k不能小于1,不能大于数组长度,可根据需求调整异常逻辑 if (k <= 0 || k > arrLength) { throw new IllegalArgumentException("k的取值范围为1到数组长度之间"); } int base = arrLength / k; int remain = arrLength % k; int[][] output = new int[k][]; int currentPos = 0; for (int i = 0; i < k; i++) { int chunkSize = base + (i < remain ? 1 : 0); output[i] = Arrays.copyOfRange(arr, currentPos, currentPos + chunkSize); currentPos += chunkSize; } return output; }
效果验证
针对你给出的示例:输入数组{1,2,3,4,5,6,7}、k=5,调用修复后方法返回的结果为[[1,2], [3,4], [5], [6], [7]],刚好满足5个子数组的要求。
内容的提问来源于stack exchange,提问作者asprog
相关产品推荐
相关产品推荐

