Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

腾讯:不产生新数组,删除数组里的重复元素 #135

Open
sisterAn opened this issue Dec 6, 2020 · 7 comments
Open

腾讯:不产生新数组,删除数组里的重复元素 #135

sisterAn opened this issue Dec 6, 2020 · 7 comments
Labels

Comments

@sisterAn
Copy link
Owner

sisterAn commented Dec 6, 2020

数组去重的方式有很多,我们可以使用 Set 去重、filter 过滤等,详见 携程&蘑菇街&bilibili:手写数组去重、扁平化函数 ,但三种解法(Set、filter、reducer)都产生了新数组:

MDN : filter() 方法创建一个新数组, 其包含通过所提供函数实现的测试的所有元素。

那么我们如何在不产生性数组的情况下删除数组中的重复元素喃?

方式一:排序去重

MDN:sort() 方法用原地算法对数组的元素进行排序,并返回数组。默认排序顺序是在将元素转换为字符串,然后比较它们的UTF-16代码单元值序列时构建的

const removeDuplicates = (nums) => {
    // 原地排序
    nums.sort()
    // 去重
    let len = 1
    for (let i = 1; i < nums.length; i++)
        if (nums[i] != nums[i-1]) nums[len++] = nums[i];
    // 删除重复项
    nums.splice(len)
    return nums
}

// 测试
removeDuplicates([1, 2, 3, 1, 3])
// [1, 2, 3]

方式二:优化

const removeDuplicates = (nums) => {
    let len = nums.length - 1
    for(let i = len; i>=0; i--) {
        if(nums.indexOf(nums[i]) != i) {
            nums[i] = nums[len --]
        }
    }
    // 删除重复项
    nums.splice(len+1)
    return nums
}
// 测试
removeDuplicates([1, 2, 3, 1, 3])
// [1, 2, 3]
@sisterAn sisterAn added the 腾讯 label Dec 6, 2020
@fxwing
Copy link

fxwing commented Dec 7, 2020

function setArr(arr) {
  for (let i = 0; i < arr.length; i++) {
    for (let j = i + 1; j < arr.length; j++) {
      if (arr[i] === arr[j]) {
        arr.splice(j, 1);
        j--
      }
    }
  }
  return arr
}

@fxwing
Copy link

fxwing commented Dec 7, 2020

function setArr(arr) {
  for(let i = 0;i<arr.length;i++){
    if(arr.indexOf(arr[i])!==i){
      arr.splice(i,1);
      i--
    }
  }
  return arr
}

@lywq9296
Copy link

lywq9296 commented Dec 7, 2020

let uniqueArr=function uniqueArr(arr){

	let map={};
	
	let len = arr.length-1;
	
	while(len>=0){
		let item = arr[len];
		if(map[item]){
			arr.splice(len,1)
		}else{
			map[item]=true;
		}
		len--;
	}
	
	return arr;

}

@fxwing
Copy link

fxwing commented Dec 7, 2020

function setArr(arr, map = new Map()) {
  let idx = arr.length - 1;
  while (idx >= 0) {
    if (map.get(arr[idx])) {
      arr.splice(idx, 1)
    } else {
      map.set(arr[idx], true)
    }
    idx--;
  }
  return arr
}

@z253573760
Copy link

const arr = [1, 2, 3, 1, 3, 5, 5, 5, 5, 5, 5];

function removeDuplicates(list) {
  const map = {};
  for (let i = 0; i < list.length; i += 1) {
    const item = list[i];
    if (!map[item]) {
      map[item] = true;
    } else {
      list.splice(i, 1);
      i -= 1;
    }
  }
}

removeDuplicates(arr);
console.log(arr); // [1, 2, 3, 5];

@XW666
Copy link

XW666 commented Apr 20, 2021

const setArr = arr => {

// 利用对象属性唯一性
let obj = {}
for (let i = 0; i < arr.length; i++) {
if (obj[arr[i]]) {
arr.splice(i, 1);
i--
} else {
obj[arr[i]] = arr[i]
}
}

return arr

}

@zixiaoyan12
Copy link

// 双指针
const removeDuplicates = (nums) => {
nums.sort((a, b) => a - b);

let slow = -1;
for (let i = 0, len = nums.length; i < len; i++) {
if (nums[slow] !== nums[i]) {
nums[++slow] = nums[i];
}
}

return nums.slice(0, slow + 1);
};

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

No branches or pull requests

6 participants