数组中重复的数字 & 循环比较

97 阅读1分钟

「这是我参与2022首次更文挑战的第2天,活动详情查看:2022首次更文挑战

剑指offer03 - 数组中重复的数字

方法一:取空数组存第一次的数据

1.1 forEach

内存消耗:50.5MB

/**
 * @params {number[]} nums
 * @return {number}
 */

const findRepeatNumber = function(nums) {
	const arr = [];
  let n = null;
  nums.forEach(num => {
  	if (!arr.includes(num)) arr.push(num);
    n = num;
  })
  return n;
}

1.2 for...of...

内存消耗:48.7MB

/**
 * @params {number[]} nums
 * @return {number}
 */

const findRepeatNumber = function(nums) {
	const arr = [];
  for (let i of nums) {
  	if (arr.includes(num)) return i;
    arr.push(i)
  }
  return null;
}

1.3 for循环

内存消耗:47.7MB

/**
 * @params {number[]} nums
 * @return {number}
 */

const findRepeatNumber = function(nums) {
	const arr = [];
  for (i = 0; i < nums.length; i++) {
  	if (arr.includes(nums[i])) return nums[i];
    arr.push(nums[i])
  }
  return null;
}

方法二:

内存消耗:47.2MB

/**
 * @params {number[]} nums
 * @return {number}
 */

const findRepeatNumber = function(nums) {
	const arr = nums.sort();
  for (i = 0; i < nums.length; i++) {
  	if (arr[i] === arr[i+1]) return arr[i]
  }
}

方法三:

内存消耗: 51.4MB

/**
 * @params {number[]} nums
 * @return {number}
 */

const findRepeatNumber = function(nums) {
	const map = new Map();
  for (let i of nums) {
  	if (map.has(i)) return i;
    map.set(i, 1)
  }
  return null;
}

循环方法对比

for...in...

  1. 循环遍历对象的属性,而不是数组的索引
  2. 可以遍历数组/对象
  1. 遍历属性的属性不确定,输出结果的顺序与属性的顺序无关
  2. 不仅遍历对象(数组)自身属性,还遍历对象原型链上所有可枚举的属性
  1. 不适合数组的遍历,会产生更多的性能消耗

for...of....

  1. 支持数组、类数组、字符串、Map、Set对象遍历
  2. 不支持循环普通对象

forEach

  1. 不能 break & return;
  2. 只能通过throw Error() 跳出循环

其他ES6语法

  • map
  • filter
  • some
  • every
  • reduce