查找重复出现N次或N次以上的数组项

1. 临时变量+遍历
function duplicates (arr,repeatSum){
	//将数组排序
	arr = arr.sort()
	
	//原数组长度
	const n = arr.length
	
 	//用于保存重复元素的数组
    let newArr = []

	//临时变量用于临时保存符合条件的重复元素
	let dup = undefined

	//遍历数组
	for(let i = 0 ; i < n ; i++){
		//当前元素
		const current = arr[i]
		
		//如果当前元素是重复元素,将其添加到结果数组,并跳过此次循环
		if( current === dup ) {
			newArr.push(current)
			continue
		}


		//否则说明是一个新值
		
		//如果剩下的数小于要求的重复次数
		//说明剩下的数已经不可能满足条件
		//直接跳出循环
		if( (n-i) <  repeatSum ) {
			break
		}


		//从新数开始往后数repeatSum个数
		//如果值跟当前新值不同
		//说明当前这个数不满足条件
		//直接跳过
		if( arr[i+repeatSum-1] !== current ){
			continue
		}

		//当前满足条件
		//重新把它标记成重复添加到结果数组
		dup = current
		newArr.push(current)
	}
	
	return newArr
	
}
2. 临时数组+遍历
function duplicates (arr,repeatSum){
	//将数组排序
	arr = arr.sort()
	
	//原数组长度
	const n = arr.length
	
 	//用于保存重复元素的数组
    let newArr = []

	//原数组为空,直接返回
	if(!n) {
		return newArr
	}

	//dups 记录重复元素,从第0个开始
	let dups = [arr[0]]

	//从第一个开始遍历
	for(let i = 0 ; i < n ; i++){
		//当前元素
		const current = arr[i]
		
		//如果当前元素是已遇到过的重复元素,将其推入
		if( current === dups[0] ) {
			dups.push(current)
			continue
		}


		//否则说明是一个新值
		//检查先前重复的元素,如果超过指定次数,就添加到数组
		if( (dups.length >=  repeatSum ) {
			dups.forEach(function(dup){
				newArr.push(dup)
			})
		}


		//将重复的元素重新初始化为当前元素
		dups = [current]
	}
	//检查最后的重复元素是否超过指定次数,同样加入结果数组
	/*
		if( dups.length >=  repeatSum ) {
			dups.forEach(function(dup){
				newArr.push(dup)
			})
		}
	*/
	
	
	return newArr
	
}
3. Map映射表方式
function duplicates (arr,repeatSum){

 	//建一个映射表,保存一个值到重复值数组的映射
 	let m = new Map()
    
    //用于保存结果的数组
    let newArr = []
    
    //遍历数组,原数组不要求有序
    for(let value of arr){
    	//通过映射表拿到重复值数组
        const array = m.get(value)
		//数组存在,说明这个值之前出现过,直接推入数组 
        if(array){
            array.push(value)
        }else{
        	//否则,说明这是一个新值,建立映射关系
            m.set(value,[value])
        }
    }
    
   //遍历映射表每个value,即每个重复值数组
    m.forEach(function(array){
    	//如果数组长度刚好是要求的重复次数
        if(array.length >= repeatSum){
            array.forEach(function(value){
            	//将其加入到结果数组
                newArr.push(value)
            })
        }
    })

    return newArr
    
    
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 如果您想要比较多个数组并获取n个不重复的组合,您可以使用Python中的itertools模块来实现。以下是一个样例代码,可以帮助您理解如何使用itertools模块: ```python import itertools # 假设您有3个数组 a = [1, 2, 3] b = [4, 5] c = [6, 7] # 将这些数组组合成一个列表 arrays = [a, b, c] # 计算所有可能的组合,并添加到一个集合中以去除重复 combinations = set(itertools.product(*arrays)) # 取前n个不重复的组合 n = 5 unique_combinations = list(itertools.islice(combinations, n)) print(unique_combinations) ``` 在上面的代码中,我们首先将所有要比较的数组组合成一个列表。然后,我们使用`itertools.product()`函数计算所有可能的组合,并使用`set()`函数将它们添加到一个集合中以去除重复。最后,我们使用`itertools.islice()`函数从这个集合中取出前n个不重复的组合。 请注意,如果您要比较的数组非常大,那么计算所有可能的组合可能会非常耗时和占用内存。在这种情况下,您可能需要考虑使用更高级的算法查找n个不重复的组合。 ### 回答2: 要实现多个数组的对比,取得n个不重复组合,可以通过以下步骤进行: 1. 首先,确定需要对比的多个数组。将这些数组分别存储起来,每个数组可以用一个列表来表示。 2. 然后,利用嵌套循环来遍历这些数组。假设有m个数组,则需要嵌套m层循环来遍历每个数组的元素。 3. 在循环中,选择一个数组的元素作为基准,依与其他数组的元素进行比较。可以使用条件语句来判断是否有重复。 4. 如果发现有重复的元素,则跳过当前循环,继续下一个元素的比较。 5. 如果没有重复的元素,将这些元素组合起来形成一个组合,并将该组合存储到一个结果列表中。 6. 继续循环,直到找到n个不重复组合。 7. 最后,返回结果列表即可。 需要注意的是,在实现时,可以根据具体需求来确定如何处理重复元素。有时候可能需要保留所有组合,有时候可能需要仅保留其中一种组合。此外,时间复杂度也需要考虑,如果数组过大或组合数量较多,可能需要采用更高效的算法来优化程序性能。 ### 回答3: 假设有m个数组,每个数组中有n个元素。现在我们要通过对比这些数组,取得n个不重复的组合方式。 首先,我们需要确定组合的数量。根据计算组合数量的公式,如果有m个数组,每个数组中有n个元素,那么不重复组合的数量为C(m, n),即从m个数组中选择n个数组进行组合。 接下来,我们可以使用嵌套循环的方式来遍历这些数组。外层循环遍历第一个数组的元素,内层循环遍历第二个数组的元素。以此类推,直到遍历完所有的数组。 在每一循环中,我们可以将当前选中的元素保存在一个临时的数组中。当这个临时数组的长度达到了n个元素,即我们已经取得了一个完整的组合。这时,我们可以将这个组合保存在一个结果数组中。 在进行嵌套循环时,需要注意避免选择相同的数组重复的元素。我们可以设置一个变量来记录已经使用过的数组和元素,确保下一的选择不会重复。 最后,当所有的组合都找到之后,我们可以将结果数组返回,即得到了这m个数组对比取得n个不重复组合的结果。 需要注意的是,这个方法的时间复杂度是O(m^n),在m和n较大时,可能会有较高的计算成本。因此,在实际应用中,我们可能需要根据具体情况进行优化或使用其他算法来解决此问题。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值