给定一个数组 [1,2,3,4,5,6,7,8,9] 和一个数字 m=4
满足数字随机分配且分为m组,保证每组数字个数尽量相同
输出:
[[2,5],[1,8,9],[7,3],[6,4]]
给定一个数组 [1,2,3,4,5,6,7,8,9] 和一个数字 m=4
满足数字随机分配且分为m组,保证每组数字个数尽量相同
输出:
[[2,5],[1,8,9],[7,3],[6,4]]
function trans (arr, length) {
if (length === 0) return null
let order = [...Array(length).keys()]
let result = order.map(i => [])
let cur = 0
while (arr.length) {
let i = Math.floor(Math.random() * arr.length) // 随机取元素的下标
result[cur++].push(arr.splice(i, 1)[0])
cur %= length
}
// 上述遍历结束之后永远是前面的元素含有的数字的个数不小于后面元素含有的数字的个数
// 所以下述操作打乱一下分好组的元素的顺序
let order1 = []
while (order.length) {
let i = Math.floor(Math.random() * order.length)
order1.push(order.splice(i, 1)[0])
}
return order1.map(i => result[i])
}
trans( [1, 2, 3, 4, 5, 6, 7, 8, 9], 4)
这个问题for循环嵌套就可以完成 外循坏写 for(var i = 0 ; i < 4 ; i ++)表示只循环四次 内循环具体把你的数字push进去 然后外循环创建个新数组 内循环每结束一次 外循坏push一次
额,清一色javascript,我来一个java版的吧
/**
* 分割数组
* @param arr 原数组
* @param m 分割个数
* @return 结果
*/
private static int[][] Test(int[] arr, int m) {
//参数判断
if (arr==null || m > arr.length)
return null;
else {
int[][] result = new int[m][];
int everyArrCount = arr.length / m; //计算出,每一个分组的大小
for (int i = 0; i < m; i++) {
int count = 0;
//要对分割的最后一个数组进行特殊处理,因为有可能不是均分
if (i!=m-1) {
count = everyArrCount;
}
else {
count = arr.length-everyArrCount*i;
}
result[i] = new int[count];
for (int j = 0; j < count; j++) {
result[i][j] = arr[i*everyArrCount+j];
}
}
return result;
}
}
13 回答12.7k 阅读
7 回答1.8k 阅读
3 回答2.5k 阅读✓ 已解决
3 回答1.1k 阅读✓ 已解决
2 回答1.1k 阅读✓ 已解决
6 回答775 阅读✓ 已解决
6 回答1k 阅读
这里有点瑕疵,就是9个元素,输出4个的话,子元素个数固定为2、2、3、2,这与
(arr.length/count).toFixed(0)
的算法有关,具体怎么优化,你可以自己动脑想一下