算法学习day6 哈希
哈希表是根据关键码进行访问的数据结构。常见的Array,Set,Map都属于哈希表。
当要快速排查某个元素是否出现在集合中时,就要想到用哈希表。
对于哈希表还不太理解,只处于看了解题思路,知道要用数组或Set或Map,然后自己尝试有些可以写出来的阶段。
242. 有效的字母异位词
var isAnagram = function(s, t) {
// 如果长度不相等,必定不是
if(s.length !== t.length) return false
//设置大小为26字母长的数组,每个位置存放相应字母计数
let newArr = new Array(26).fill(0)
//获得字母a的ascii码
let aCode = 'a'.charCodeAt()
//通过两个字母ASCII码相减,得到的值在数组中对应位置计数
for(let i=0;i<s.length;i++){
newArr[s[i].charCodeAt()-aCode]++
}
//遍历另一串字符串,判断是否有多余字母出现
for(let i=0;i<t.length;i++){
newArr[t[i].charCodeAt()-aCode]--
// 若有小于0,说明出现其他字母,不符合要求
if(newArr[t[i].charCodeAt()-aCode]<0) return false
}
//最后判断是否都为0,即所有出现的字母和出现次数都相等
for(let i=0;i<26;i++){
if(newArr[i] !== 0){
return false
}
}
return true
};
349. 两个数组的交集
/**
* @param {number[]} nums1
* @param {number[]} nums2
* @return {number[]}
*/
var intersection = function(nums1, nums2) {
// 两个数组都进行去重
let nums1Set = new Set(nums1)
let nums2Set = new Set(nums2)
let result = new Set()
// 为了对size小的那个set进行遍历,这里对nums2set 进行遍历,它需要是size小的那个,所以若不符合要求先进行交换
if(nums1Set.size<nums2Set.size){
nums2Set, nums1Set= nums1Set,nums2Set
}
// 交集应该从短的集合里产生
for(let i of nums2Set){
// 若是长的集合中也有这个元素,则添加到最终结果中
nums1Set.has(i) && result.add(i)
}
return Array.from(result)
};
202. 快乐数
/**
* @param {number} n
* @return {boolean}
*/
var isHappy = function(n) {
let res=n
let seto = new Set()
//当等于1成功时跳出循环
while(res !== 1){
// 进行每个数平方求和运算
res = getSum(res)
// 如果集合里出现了这个结果说明陷入死循环,不会得到结果1,那么就返回false
if(seto.has(res)){
return false
}
// 将求和出现过的结果加入set中
seto.add(res)
}
return true
};
var getSum = function (n) {
let sum = 0;
while (n) {
//余数
sum += (n % 10) ** 2;
//个位,十位,百位的顺序删除已经统计的数
n = Math.floor(n/10);
}
return sum;
}
1. 两数之和
暴力
/**
* @param {number[]} nums
* @param {number} target
* @return {number[]}
*/
var twoSum = function(nums, target) {
// 暴力循环 两数之和判断
for(let i=0;i<nums.length;i++){
for(let j=i+1;j<nums.length;j++){
if(nums[i]+nums[j] === target){
return [i, j]
}
}
}
return [0,0]
};
Map
使用Map对象保存键值对。nums:为输入数组,key:要寻找和索引对应值之和等于target的值,value:保存一个值的下标(索引值),即 key+nums[value] = target。
保存键值对前,先判断是否存在这个键,即判断是否找到了 相加之和等于target的另一个值。若找到即可输出该值的索引和之前保存的值的索引。
/**
* @param {number[]} nums
* @param {number} target
* @return {number[]}
*/
var twoSum = function(nums, target) {
let temp = new Map()
let i
for( i=0;i<nums.length;i++){
// 用map 保存键值对,key:要寻找的和下标对应值之和等于target的值,value:保存一个值的下标(索引值)
// 保存键值对前,先判断是否存在这个键,即是否找到了 相加之和等于target的另一个值
if(temp.has(nums[i])){
// 返回这个值的下标i,和这个值在map中对应的value
return [i,temp.get(nums[i])]
}
// 储存要寻找的值和这个值的下标
temp.set(target-nums[i],i)
}
return [0,0]
}