代码随想录算法营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)也不是很清楚,需要再学习。