242.有效的字母异位词
题目
求解
由于题目说明两字符串只包含小写字母,因此字符串中可能出现的元素只有26个小写字母,借助一个长度为26的数组存放字符串中字母出现次数即可
-
定义一个长度为26,元素均为0的数组
-
遍历字符串s,记录s中字母出现的次数
-
遍历字符串t,t中每出现一个字母,在数组相应位置-1,如果是字母异位词,那么数组中的元素从不是0变为0后就不会再被访问
代码
var isAnagram = function(s, t) { if(s.length!==t.length){return false;} let res = new Array(26).fill(0); let base = 'a'.charCodeAt(); for(const i of s){ res[i.charCodeAt()-base]++; } for(const i of t){ if(!res[i.charCodeAt()-base]){return false;} res[i.charCodeAt()-base]--; } return true; };
349. 两个数组的交集
题目
求解
数组的交集即在两个数组中都出现过的元素。由于长度不固定且元素唯一,选择使用set
-
定义一个set表示更长的数组中的元素
-
遍历更短的数组,如果该数组中的元素出现在set中,则需返回该元素
代码
var intersection = function(nums1, nums2) { // nums1更长 if(nums1.length<nums2.length){ [nums1,nums2] = [nums2,nums1]; } // 定义set let nums1Set = new Set(nums1); let res = new Set(); for(let i=0;i<nums2.length;i++){ nums1Set.has(nums2[i]) && res.add(nums2[i]); } return Array.from(res); };
202. 快乐数
题目
求解
如果一个数是快乐数,那么在计算每个位置上数字的平方和时出现的结果不会重复。一旦重复,说明不是平方和
判断一个数是否出现过,使用set
如果该数出现过,不是快乐数;如果得到1,是快乐数
代码
var isHappy = function(n) { // 如果无限循环 那么就不是快乐数,问题变成看计算得到的和是否出现过 // set let record = new Set(); function getSum(n){ let res = 0; while(n){ res += (n%10)**2; n = Math.floor(n/10); // 相除并得到整数结果 } return res; } while(!record.has(n) && n!==1){ record.add(n); n = getSum(n); } return n===1; };