算法学习day6 哈希

哈希表是根据关键码进行访问的数据结构。常见的Array,Set,Map都属于哈希表。
当要快速排查某个元素是否出现在集合中时,就要想到用哈希表。

对于哈希表还不太理解,只处于看了解题思路,知道要用数组或Set或Map,然后自己尝试有些可以写出来的阶段。

242. 有效的字母异位词

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. 两个数组的交集

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. 快乐数

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. 两数之和

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]
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值