242.有效的字母异位词
题目链接:242.有效的字母异位词
解题思路🤔
1、定义一个数组record,数组大小为26(因为字符a到字符z的ASCII是26个连续的数值),使用charCodeAt() 方法可返回指定位置的字符的 Unicode 编码,记录字符串s中字符出现的次数。
2、遍历 字符串s,只需要将 s[i] - ‘a’ 所在的元素做+1 操作即可。
3、遍历 字符串t,只需要将 t[i] - ‘a’ 所在的元素做-1 操作即可。
4、最后检查一下,record数组如果有的元素不为零0,说明字符串s和t一定是谁多了字符或者谁少了字符,return 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;
};
相关题目🧐
- 383.赎金信
- 49.字母异位词分组
- 438.找到字符串中所有字母异位词
总结👀
注意第二个循环遍历字符串t时:先进行数组是否有元素不为0的判断
349. 两个数组的交集
349. 两个数组的交集
解题思路🤔
1、求两个数组的交集,注意交集需去重。
2、若题目没有限制数值的大小,不能用数组做哈希表。
如果哈希值比较少、特别分散、跨度非常大,使用数组就造成空间的极大浪费,不能用数组做哈希表。
3、把nums1转化为哈希表,把nums1中的所有数值放到哈希表里。 4、遍历nums2,查每一个元素是否在哈希表中出现过。 5、如果出现过,放入result集合里。注意集合去重。
代码⌨️
var intersection = function(nums1, nums2) {
let num1 = new Set(nums1);
let num2 = new Set();
for (let key of nums2) {
if(num1.has(key)) {
num2.add(key);
}
}
return Array.from(num2);
};
相关题目🧐
- 350.两个数组的交集 II
总结👀
1、set结构不会添加重复的值。(经常用set解决去重问题)
2、set实例转数组:const s = new Set([1, 2, 3]); Array.from(s);3、set方法:
//add(): 添加元素: const s = new Set(); s.add(1).add(2).add(3); Array.from(s); // [1, 2, 3] //has(): 查询Set实例是否存在某元素(返回布尔值): const s = new Set(); s.add(1).add(2).add(3); s.has(1); // true //delete(): 删除Set实例中某个元素(返回布尔值): const s = new Set(); s.add(1).add(2); s.delete(1); Array.from(s); // [2] //clear(): 清空Set实例: const s = new Set(); s.add(1).add(2).add(3); Array.from(s); // [1, 2, 3] s.clear(); Array.from(s); // []4、迭代
- key():返回键名
- values():返回键值
- entries():返回键值对
键名=键值- for-of
- forEach
202. 快乐数
题目链接:202. 快乐数
解题思路🤔
1、题目说了会出现两种情况:
- 第一种:数变为1,是快乐数,返回true;
- 第二种:无限循环,始终变不到1,返回false。 2、无限循环时,sum重复出现,用哈希法判断。
代码⌨️
// 方法一:使用map
var isHappy = function (n) {
let m = new Map()
const getSum = (num) => {
let sum = 0
while (n) {
sum += (n % 10) ** 2
n = Math.floor(n / 10)
}
return sum
}
while (true) {
// n出现过,证明已陷入无限循环
if (m.has(n)) return false
if (n === 1) return true
m.set(n, 1)
n = getSum(n)
}
}
// 方法二:使用环形链表的思想 说明出现闭环 退出循环
var isHappy = function(n) {
if (getN(n) == 1) return true;
let a = getN(n), b = getN(getN(n));
// 如果 a === b
while (b !== 1 && getN(b) !== 1 && a !== b) {
a = getN(a);
b = getN(getN(b));
}
return b === 1 || getN(b) === 1 ;
};
// 方法三:使用Set()更简洁
/**
* @param {number} n
* @return {boolean}
*/
var getSum = function (n) {
let sum = 0;
while (n) {
sum += (n % 10) ** 2;
n = Math.floor(n/10);
}
return sum;
}
var isHappy = function(n) {
let set = new Set(); // Set() 里的数是惟一的
// 如果在循环中某个值重复出现,说明此时陷入死循环,也就说明这个值不是快乐数
while (n !== 1 && !set.has(n)) {
set.add(n);
n = getSum(n);
}
return n === 1;
};
// 方法四:使用Set(),求和用reduce
var isHappy = function(n) {
let set = new Set();
let totalCount;
while(totalCount !== 1) {
let arr = (''+(totalCount || n)).split('');
totalCount = arr.reduce((total, num) => {
return total + num * num
}, 0)
if (set.has(totalCount)) {
return false;
}
set.add(totalCount);
}
return true;
};
总结👀
对数字每个位置上数字的平方进行求和。
const getSum = (num) => { let sum = 0 while (n) { sum += (n % 10) ** 2 n = Math.floor(n / 10) } return sum }
1. 两数之和
题目链接:1. 两数之和
解题思路🤔
1、本题需要一个集合存放遍历过的元素,遍历数组时,询问集合,是否存在这个数组。
2、同时要知道该元素对应的下标,需要用key value结构存放。key存放数据元素,value存放数据元素对应的下标。(这道题要判断元素是否出现,所以key存放数据元素)
3、边遍历边寻找对应元素。
代码⌨️
var twoSum = function(nums, target) {
let hash = {};
for (let i = 0; i < nums.length; i++) {
if (hash[target - nums[i]] !== undefined) {
return [hash[target - nums[i]], i];
}
hash[nums[i]] = i;
}
return [];
};