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
}