哈希表哈希表是一种常见的数据结构,算法面试题中经常会用到哈希表。哈希表最大的优点是效率高。在哈希表中插入、删除或查找一个元素只需要O(1)的时间。因此,哈希表经常被用来优化时间效率。哈希表设计设计哈希表的前提是要存储的元素需要一个可以计算出自己哈希值的函数。哈希表最大的特点就是效率高。存储或读取元素只需要O(1)的时间。插入、删除、随机访问都是O(1)的容器。设计一个数据结构,使得下面三个操作的时间复杂度为O(1)。字段转数组不是O(N)吗?/***在这里初始化你的数据结构。*/varRandomizedSet=function(){this.numToLocation=newMap();this.nums=[]};/***向集合中插入一个值。如果集合尚未包含指定元素,则返回true。*@param{number}val*@return{boolean}*/RandomizedSet.prototype.insert=function(val){if(this.numToLocation.has(val)){returnfalse}this.numToLocation.set(val,this.nu??ms.length);this.nums.push(val);returntrue;};/***从集合中移除一个值。如果集合包含指定元素,则返回true。*@param{number}val*@return{boolean}*/RandomizedSet.prototype.remove=function(val){if(!this.numToLocation.has(val)){returnfalse;}让location=this.numToLocation.get(val);this.numToLocation.set(this.nums[this.nums.length-1],location);this.numToLocation.delete(val);//数组对应删除,这里是用数据的最后一个元素覆盖要删除的元素,然后数组长度减1,通过这个技巧实现时间恢复复杂度为O(1)this.nums[location]=this.nums[this.nums.length-1];this.nums.length--;returntrue;};/***从集合中获取一个随机元素。*@return{number}*/RandomizedSet.prototype.getRandom=function(){//随机生成一个从0到this.nums.length的整数letp=parseInt(Math.random()*this.nums.length);returnthis.nums[p];};/***你的RandomizedSet对象将被实例化并这样调用:*varobj=newRandomizedSet()*varparam_1=obj.insert(val)*varparam_2=obj.remove(val)*varparam_3=obj.getRandom()*/LeastRecentlyUsedCache请设计实现一个最近最少使用(LeastRecentlyUsed,LRU)缓存,要求下面两个操作的时间复杂度为O(1)/***@param{number}capacity*/varLRUCache=function(capacity){this.cache=newMap()this.capacity=capacity};/***@param{number}key*@return{number}*/LRUCache.prototype.get=function(key){const{cache}=thisif(!cache.has(key)){return-1}constval=cache.get(key)cache.delete(key)cache.set(钥匙,val)returnval};/***@param{number}key*@param{number}value*@return{void}*/LRUCache.prototype.put=function(key,value){const{cache,capacity}=thisif(cache.has(key)){cache.delete(key)}if(cache.size===capacity){constit=cache.keys()cache.delete(it.next().value)复制代码}cache.set(key,value)};/***您的LRUCache对象将被实例化并这样调用:*varobj=newLRUCache(capacity)*varparam_1=obj.get(key)*obj.put(key,value)*/哈希表的应用哈希表是算法面试中经常用到的数据结构,比如用哈希表记录字符串中每个字符出现的次数或者每个字符出现的位置是否有效AnagramsforGiven两个字符串s和t,判断它们是否是一组变位词。在一组字谜中,其中的字符和每个字符出现的次数相同,但字符的顺序不能相同。例如,“anagram”和“nagaram”是变位词。只考虑英文字母,然后用数组模拟哈希表/***@param{string}s*@param{string}t*@return{boolean}*/varisAnagram=function(str1,str2){if(str1.length!==str2.length)返回false;if(str1===str2)returnfalseletcounts=newArray(26).fill(0)for(letchofstr1){counts[ch.charCodeAt()-97]++}for(letchofstr2){if(counts[ch.charCodeAt()-97]==0)returnfalsecounts[ch.charCodeAt()-97]--}returntrue};if考虑非英文字母,使用真正的哈希表HashMapvarisAnagram=function(str1,str2){if(str1.length!==str2.length)returnfalse;constmap=newMap()for(letchofstr1){map.set(ch,(map.get(ch)||0)+1)}for(letchofstr2){if(!map.get(str2))返回假;map.set(ch,(map.get(ch)||0)-1)}returntrue}字谜标题:给定一组单词,请按字谜将它们分组。比如输入一组词["eat","tea","tan","ate","nat","bat"],这组词可以分为3组,即["eat",“茶”,“吃”],[“棕褐色”,“nat”]和[“蝙蝠”]。假设单词只包含英文小写字母。/***@param{string[]}strs*@return{string[][]}*/vargroupAnagrams=function(strs){varmap=newMap();strs.forEach((str)=>{constkey=str.split('').sort().join('')constval=(map.get(key)||[])val.push(str)map.set(key,val)})常量结果=[];for(letvalueofmap.values()){result.push(value);}返回结果};外星语言排序了吗题目:有一种外星语言,它的字母表只包含所有英文小写字母,只是字母表的顺序不同。给定一组单词和字母顺序,确定单词是否按字母顺序排序。例如,输入一组单词[“offer”、“is”、“coming”],字母顺序为“zyxwvutsrqponmlkjihgfedcba”,由于字母'o'在字母表中位于'i'之前,单词“offer”排在“is”之前;同样,由于字母“i”在字母表中出现在“c”之前,因此“is”一词出现在“coming”之前。因此,单词集按字母顺序排序,应该输出true。想过过滤再比较,但是我觉得不对,我没有考虑重复varisAlienSorted=function(words,order){constdict={}for(leti=0;i
