代码随想录算法营DAY6 | 242.有效的字母异位词、349. 两个数组的交集、202. 快乐数、1. 两数之和

本文介绍了四种编程题目的解决方案,包括判断有效字母异位词、找出两个数组的交集、判断快乐数以及找到数组中两数之和的方法。主要利用哈希表(如JavaScript中的Map和Set)来优化算法,提高效率。对于不熟悉JavaScript数据结构的读者,这些实例提供了学习机会。
摘要由CSDN通过智能技术生成

代码随想录算法营DAY6 | 242.有效的字母异位词、349. 两个数组的交集、202. 快乐数、1. 两数之和

242.有效的字母异位词

题目链接: 242.有效的字母异位词
思路:
1.遍历s,用一个array记录每个字母出现的频率(字母ascii减去’a’的ascii,只有26个值)
2.遍历t,减去array中t出现的字母
3.如果array中有非零元素,说明s和t中字幕出现频率不完全一致,返回false

代码:

var isAnagram = function(s, t) {
    if(s.length !== t.length) return false;
    const resSet = new Array(26).fill(0);
    const base = "a".charCodeAt();
    for(const i of s) {
        resSet[i.charCodeAt() - base]++;
    }
    for(const i of t) {
        if(!resSet[i.charCodeAt() - base]) return false;
        resSet[i.charCodeAt() - base]--;
    }
    return true;
};

349. 两个数组的交集

题目链接: 349. 两个数组的交集
思路:
1.定义一个numset用来存放num1
2.定义一个reset用来存放交集数
3.遍历nums2,用has方法检查numset里是否有相同元素,如果有,用add方法加入reset
4.返回数组,要用array.from(reset)

代码:

var intersection = function (nums1, nums2) {
    // 优化思路:将较长的数组存入numSet中,减少对比时的循环次数。
    // if (nums1.length < nums2.length) {
    //     let temp = nums1;
    //     nums1 = nums2;
    //     nums2 = temp;
    // }

    const numSet = new Set(nums1); // numSet存放nums1的元素,用于对比
    const resSet = new Set(); // 将其存入对比后相同的元素

    // 遍历nums2,has()方法用于判断是否存在与nums2相同的元素,add()方法用于向resSet中插入保存
    for (let i = 0; i < nums2.length; i++){
        if(numSet.has(nums2[i])) {
			resSet.add(nums2[i]);
		}
    }  
    return Array.from(resSet); // 得到的结果是Set结构,最后还需要转化为数组输出

202. 快乐数

题目链接: 202. 快乐数
思路:
1.定义一个求每一位数字平方和的函数
2.定义一个set用来接收sum
3.循环求sum,并判断sum是否在set中出现过,若出现过返回false,若sum===1返回true,否则更新n继续循环。
代码:

var isHappy = function(n) {
	// 将获取平方和封装为函数
    const getSum = function(n){
        let sum = 0;
        while(n) {
            sum += (n % 10) * (n % 10); // 计算个位的平方
            n = Math.floor(n / 10); // 计算更高位的平方
        }
        return sum;
    };

    let set = new Set(); // 定义Set接收平方和sum

    while(true){ // 循环开始
        let sum = getSum(n); // 获取平方和
        if (sum === 1) return true; // sum = 1与 n = 1其实是一样的,用哪个都可以
        if (set.has(sum)) { // 发现Set中存在sum,返回false
            return false
        } else { // 未发现存在sum,向Set中插入sum
            set.add(sum);
        }
        n = sum; // 一次对比后,将n更新为sum
    }
};

1. 两数之和

题目链接: 1. 两数之和
思路:
1.构造一个map来记录和查找数组元素,数组元素为key,下标为value
2.遍历数组,先判断target-nums[i]是否在map里出现过,如果在返回两个数的下标(也就是map的value),如果不在则把它存进map里。
3.若遍历完没有找到一对和等于target的数,返回空数组。
代码:

var twoSum = function(nums, target) {
    const map = new Map(); // 构造Map()
    
    for(let i = 0; i < nums.length; i++) { // 遍历数组
        let addEnd = target - nums[i]; // 让变量addEnd接收另搞一个加数
        
        if(map.has(addEnd)){ // 如果addEnd在Map中存在,匹配成功
            return [map.get(addEnd), i]; // 返回两个加数,get()方法:获取Map中的value
        } else {
            map.set(nums[i], i); // 匹配失败,向map中添加key与value
        }
    }
    return []; // 如果一直匹配失败,返回空数组
};

感想总结

哈希表这块思路不是很难,但是想到用哈希表的方法可能有点难。另外对js的语法不熟悉,看代码还是有些不太懂的地方,对于js的数据结构(map,set和array)也不是很清楚,需要再学习。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值