第五天——哈希表(242.有效的字母异位词,349. 两个数组的交集, 202. 快乐数,1. 两数之和 )

Tags
哈希表

242.有效的字母异位词

学习链接

 

个人思路

这道题比较直接,直接对s构建一个哈希表,然后对t做遍历,如果get不存在就报错,存在就 value - 1,最后发现有不为0的属性就报错
 

解题代码

 
/** * @param {string} s * @param {string} t * @return {boolean} */ var isAnagram = function(s, t) { const sArray = s.split('') const tArray = t.split('') let map = {} let res = true sArray.forEach(item =>{ if(map[item]){ map[item] ++ } else{ map[item] = 1 } }) tArray.forEach(item=>{ if(map[item]){ map[item] -- } else { res = false } }) Object.values(map).forEach(item=>{ if(item !== 0){ res = false } }) return res };

相关题目

383. 赎金信

这道题和242非常类似,只需要判断magazine中有ransomNote所有内容即可,不用考虑其他的
/** * @param {string} ransomNote * @param {string} magazine * @return {boolean} */ var canConstruct = function(ransomNote, magazine) { const magazineArray = magazine.split('') const ransomNoteArray = ransomNote.split('') let map = {} let res = true magazineArray.forEach(item=>{ if(map[item]){ map[item]++ } else{ map[item] = 1 } }) ransomNoteArray.forEach(item=>{ if(map[item]){ map[item] -- } else{ res = false } }) return res };

49. 字母异位词分组

使用js api split('').sort().join('') 能快速破题
/** * @param {string[]} strs * @return {string[][]} */ var groupAnagrams = function(strs) { const map = {} for(let i = 0; i < strs.length;i++){ let str = strs[i].split('').sort().join('') if(map[str]){ map[str].push(strs[i]) } else{ map[str] = [strs[i]] } } return Object.values(map) };
 

438. 找到字符串中所有字母异位词

跟上题一样遍历比较
 
 
 

349. 两个数组的交集

学习链接

 

个人思路

构建哈希表存储并比较,最后结果用set处理即可
 

解题代码

/** * @param {number[]} nums1 * @param {number[]} nums2 * @return {number[]} */ var intersection = function(nums1, nums2) { const map = {} let res = [] nums1.forEach(item=>{ if(!map[item]){ map[item] = 1 } }) nums2.forEach(item=>{ if(map[item]){ res.push(item) } }) return [...new Set(res)] };
 

相关题目

350. 两个数组的交集 II

修改的上一道题,不在始终保持1,也不去重
/** * @param {number[]} nums1 * @param {number[]} nums2 * @return {number[]} */ var intersect = function(nums1, nums2) { const map = {} let res = [] nums1.forEach(item=>{ if(!map[item]){ map[item] = 1 } else{ map[item]++ } }) nums2.forEach(item=>{ if(map[item]){ res.push(item) map[item] -- } }) return res };
 
 
 

202. 快乐数

学习链接

个人想法

每次把结果存起来,如果重复就是死循环,返回false,就可以节省时间
 

解题代码

/** * @param {number} n * @return {boolean} */ const getSum = (n) => { let sum = 0 while(n){ sum += (n % 10)*(n % 10) n = Math.floor(n/10) // js / 不是取商,有小数 } return sum } const getSumReduce = (n) =>{ return n.split('').reduce((pre,cur)=>(pre + Number(cur) * Number(cur)),0) } var isHappy = function(n) { const map = {} while(true){ let sum = getSum(n) if(sum === 1){ return true } if(map[sum]){ return false } else{ map[sum] = 1 } n = sum } };
 
 

1. 两数之和

学习链接

个人思路

因为这道题提示了只会有一个有效答案,所以直接遍历的时候用差找对象

解题代码

/** * @param {number[]} nums * @param {number} target * @return {number[]} */ var twoSum = function(nums, target) { const map = {} for(let i = 0; i < nums.length;i++){ if(map[target-nums[i]] !== undefined){ // 不能直接 !map[target-nums[i]] 不然排除了为0的情况 return [i,map[target-nums[i]]] } else{ map[nums[i]] = i } } };