「这是我参与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...
- 循环遍历对象的属性,而不是数组的索引
- 可以遍历数组/对象
- 遍历属性的属性不确定,输出结果的顺序与属性的顺序无关
- 不仅遍历对象(数组)自身属性,还遍历对象原型链上所有可枚举的属性
- 不适合数组的遍历,会产生更多的性能消耗
for...of....
- 支持数组、类数组、字符串、Map、Set对象遍历
- 不支持循环普通对象
forEach
- 不能 break & return;
- 只能通过throw Error() 跳出循环
其他ES6语法
- map
- filter
- some
- every
- reduce