JavaScript中数组的key-value在对象中倒装的妙用
对于数组的去重、寻找指定元素的索引,通常我们都是通过遍历来解决,但是在某些应用场景下,将数组的value-key进行倒装,也即将value当做对象的key,key当做对象value,可以极大降低算法的时间复杂度,提高其性能,来看几个例子。
例1
给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。 说明: 你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗? 示例1: 输入:[2,2,1] 输出: 1 示例2: 输入: [4,1,2,1,2] 输出:4 来源:leetcode.com
var singleNumber = function(nums) { let obj = {}; for (let i = 0; i < nums.length; i++) { if (obj[nums[i]]) { delete obj[nums[i]]; } else { obj[nums[i]] = 1; } } return Object.keys(obj)[0]; };
例2
给定一个非空的整数型数组
[1,2,1,2,4,5,6,2,9,3,1,9,5,9,6]
找到其中重复次数最多的元素并返回它的索引。 来源:面试笔试题
var findMostRepeatElementIndex = function(arr) { let obj = {}; let max = 1; let result = []; for (let i = 0;i < arr.length; i++){ if(!obj[arr[i]]){ obj[arr[i]]={value:1}; obj[arr[i]].index=[].concat(i); } else { obj[arr[i]].value++; obj[arr[i]].index.push(i); if(obj[arr[i]].value>max){ max = arr[i]; result = obj[arr[i]].index; } } } return result };