当前位置: 首页 > 知识库问答 >
问题:

将数组划分为子数组,使子数组不包含重复元素

董良策
2023-03-14

我有一个由32个数字组成的数组[1,2,3,4,4,4,4,4,5,5,5,5,5,5,5,5,6,6,7,7,7,7,8,9,10,10,11,9,12,13,13,14,14,15,16,17,17]

对于我最初的问题,我不需要生成所有的排列。我只需要在每次运行我的程序时生成一个随机排列。

我的方法是使用Fisher-Yates算法随机洗牌数组,并不断重新洗牌,直到我得到所有8个子数组,没有重复的元素。当然,这不是最好的方法。

作为解决方案的一部分,我洗牌数组,从这个洗牌数组开始一个接一个地向子数组添加元素。如果任何子数组已经有一个数字,那么我会继续跳过我的洗牌数组中的元素,直到我达到一个数字,而这个数字不是我的子数组。这种方法在某些情况下是失败的。

let shuffledArray = shuffle(originalArray);
let subArrays = [];
for (let i = 0; i < 8; i++) {
    subArrays[i] = [];
    for (let j = 0; j < 32; j++) {
        if (!subArrays[i].contains(shuffledArray[j]) && !shuffledArray[j].used) {
            subArrays[i].push(shuffledArray[j])
            shuffledArray[j].used = true;
        }
        if (subArrays[i].length == 4) {
            break;
        }
    }
}

 if subArrays has any sub array such that it has duplicate elements then repeat above steps
 else we have generated a random permutation

如果有人能给出N个元素和K个群的通解,那就太好了。

这是我在SO的第一个问题。请随时编辑/提出改进建议。

共有1个答案

丁昌翰
2023-03-14

一个选择是首先将列表分成相同的数字组,然后按长度排序。然后,您可以通过从最长、第二长、第三长、第四长的每个组中提取元素来创建组。清空子组时,将其移除。

以下是JS实现:

function partition(arr, N){
    // group items together and sort by length
    // groups will be [[5, 5, 5, 5, 5], [4, 4, 4, 4], ...]

    let groups = Object.values(l.reduce((obj, n) =>{
        (obj[n] || (obj[n] = [])).push(n)
        return obj
    }, {})).sort((a,b) => b.length - a.length)

    let res = []
    while(groups.length >= N){
        let group = []
        let i = 0
        while (group.length < N){
           group.push(groups[i].pop())
           if (groups[i].length < 1) groups.splice(i, 1)
           else i++
        }
        res.push(group)
    }
    return res
}
let l = [1,2,3,4,4,4,4,5,5,5,5,5,6,6,7,7,7,7,8,9,10,10,11,12,13,13,14,14,15,16,17,17]


console.log(partition(l, 4).map(arr => arr.join(',')))

// with 5
console.log(partition(l, 5).map(arr => arr.join(',')))
 类似资料:
  • 该问题给出了两个输入:数组(arr)和由数组构成子数组的次数(n)。子数组的和应该是奇数 已经很清楚,如果所有的数字都是偶数。奇数和子数组是不可能的。对于奇数和,连续的2个数字应该是奇数+偶数或者偶数+奇数。但我似乎不能把它们分成N个子数组。请帮忙解释一下逻辑。

  • 给定一个值数组,我如何将它分成由相等元素组成的? 给定这个数组 我想要这个输出 解决这一问题的一种可能方法是创建某种索引,以指示每个元素的出现情况。 最后使用索引重建输出数组。 但是,使用此解决方案,我会丢失原始值。当然,在这种情况下,这不是一个大问题(一个值仍然存在,即使重新创建,),但我想将此解决方案应用于像这样更复杂的数据结构 实际上,我正在寻找的函数是与相反的函数 我希望我已经说清楚了,如

  • 我正在尝试解决这个算法问题: https://dunjudge.me/analysis/problems/469/ 为了方便起见,我总结了下面的问题陈述。 给定一个长度为 ( 多数元素定义为发生的元素 时限:1.5s 例如: 如果给定的数组是[1,2,1,2,3,2], 答案是5,因为从位置1到5 (0索引)的长度为5的子数组[2,1,2,3,2]具有出现为3的数字2 首先想到的是一个明显的强力(

  • 给定< code>n,数组元素的数目和< code>arr[n],数字数组,需要找到数组可以分成的子数组的最大数目,使得对于属于不同子数组的每个< code>a和< code>b,< code>GCD(a,b)=1。 例如: 任何其他进一步分裂它的企图都不会满足这些条件。 我的方法: 1.对数组进行排序 2.继续计算元素的 3.每当元素的和之前元素的