题目描述
输入
[1, 2, 4, 4, 3, 3, 1, 5, 3]
输出
[1, 3, 4]
第一种::运用reduce的第二个参数初始化allEle为{}后计算出数组中所有元素出现的次数,
然后循环判断出现次数大于1的元素放入新数组。
function duplicates(arr) {
var m = arr.reduce(function(allEle,curEle,index,arr){
if(curEle in allEle){
allEle[curEle]++;
}else{
allEle[curEle] = 1;
}
return allEle;
},{});
var n = [];
for(v in m){
if(m[v] > 1){
n.push(v);
}
}
return n;
}
第二种::用reduce对allEle进行初始化为数组后,判断allEle中不存在的元素放入,如果allEle中存在说明是重复出现的元素
并不在n数组中则放入新数组n最后返回。
function duplicates(arr) {
var n = [];
var m = arr.reduce(function(allEle,curEle,index,arr){
if(allEle.indexOf(curEle) === -1){
allEle.push(curEle);
}else if(allEle.indexOf(curEle) !== -1 && n.indexOf(curEle) === -1){ //allEle.indexOf(curEle) !== -1 可以去掉了
n.push(curEle);
}
return allEle;
},[]);
return n;
}
第三种::循环数组每一个元素的顺序出现的位置和逆序出现的位置是否一致,位置相同代表不具备相通元素,否则具备。
然后再判断新数组m中是否有这个元素,没有则加入新数组。
function duplicates(arr) {
var m = [];
arr.forEach(function(ele,index,arr){
if(arr.indexOf(ele) !== arr.lastIndexOf(ele) && m.indexOf(ele) === -1){
m.push(ele);
}
});
return m;
}
第四种::运用sort()对数组进行排序后过滤filter()数组,判断排序后的当前元素的前一个和后一个元素的是否相同,
和前一个元素相同说明重复,如果和后一个如果还相同则说明已经在第一次出现的时候return过true啦!!!
function duplicates(arr) {
return arr.sort().filter(function(_,i){
return arr[i] === arr[i + 1] && arr[i] !== arr[i - 1];
}
);
}
第五种::对数组每个元素进行遍历,并比较这个元素后边的每个元素是否有相同的,在碰到相同的时候还要判断是否存在,不存在则放入新数组arr1。
其实我觉得这个还是蛮繁琐的,比较的次数明显增多。
function duplicates(arr) {
var arr1=[];
for(var i=0;i<arr.length;i++){
for(var j=i+1;j<arr.length;j++){
if((arr[i]==arr[j]) && (!arr1.contains(arr[i]))){
arr1.push(arr[i]);
break;
}
}
}
return arr1;
}
Array.prototype.contains = function (obj){
var i = this.length;
while(i--){
if (this[i] === obj){
return true;
}
return false;
}
}
第六种::
/* 时间复杂度为O(n)算法。
思路:遍历数组,将数组的元素和数组出现的次数分别作为对象属性和值。遍历对象,取出
次数大于1的即可。 */
function duplicates(arr) {
var obj = {};
var repeatList = [];
//遍历数组,将数组的值作为obj的索引,出现次数为值
arr.forEach(function(item){
if(obj[item]){
obj[item] +=1;
}else{
obj[item] = 1;
}
});
//获取对象自身属性的keys
var propertyNames = Object.getOwnPropertyNames(obj);
//遍历对象,将重复出现的元素取出
propertyNames.forEach(function(item){
if(obj[item] > 1){
repeatList.push(parseInt(item));
}
});
return repeatList;
}