/**
* @param {string} s
* @param {string} t
* @return {boolean}
*/
var isAnagram = function(s, t) {
let ms = new Map();
let mt = new Map();
for(let i=0;i<s.length;i++) {
if(ms.has(s[i])) {
let k=ms.get(s[i]);
ms.set(s[i],k+1);
}
else {
ms.set(s[i],1);
}
}
for(let i=0;i<t.length;i++) {
if(mt.has(t[i])) {
let k=mt.get(t[i]);
mt.set(t[i],k+1);
}
else {
mt.set(t[i],1);
}
}
if(ms.size!==mt.size) return false;
for(let e of ms) {
if(!mt.has(e[0]) || mt.get(e[0])!==e[1]) {
return false;
}
}
return true;
};
第二种方法
/**
* @param {string} s
* @param {string} t
* @return {boolean}
*/
var isAnagram = function(s, t) {
let a = new Array(27);
for(let i=0;i<a.length;i++) {
a[i]=0;
}
let base = 'a'.charCodeAt();
for(let str of s) {
a[str.charCodeAt()-base]++;
}
for(let str of t) {
a[str.charCodeAt()-base]--;
}
return a.every((item)=>{return item==0})
};
我才知道js中的字符串-字符串不是数值,之前在c++里可以用’a’-'a’得到相对位置。在js里不行,必须用方法。charCodeAt()
/**
* @param {number[]} nums1
* @param {number[]} nums2
* @return {number[]}
*/
var intersection = function(nums1, nums2) {
let s1= new Set(nums1);
let s2= new Set(nums2);
let result = new Array();
for(item of s1) {
if(s2.has(item)) {
result.push(item);
}
}
return result;
};
/**
* @param {number[]} nums1
* @param {number[]} nums2
* @return {number[]}
*/
var intersect = function(nums1, nums2) {
let newn2=nums2;
let result = new Array();
for(let item of nums1) {
if(newn2.includes(item)) {
result.push(item);
for(let i=0;i<newn2.length;i++) {
if(newn2[i]===item) {
newn2[i]=-1;
break;
}
}
}
}
return result;
};
思路
这道题目看上去貌似一道数学问题,其实并不是!
题目中说了会 无限循环,那么也就是说求和的过程中,sum会重复出现,这对解题很重要!
正如:关于哈希表,你该了解这些! (opens new window)中所说,当我们遇到了要快速判断一个元素是否出现集合里的时候,就要考虑哈希法了。
所以这道题目使用哈希法,来判断这个sum是否重复出现,如果重复了就是return false, 否则一直找到sum为1为止。
还有一个难点就是求和的过程,如果对取数值各个位上的单数操作不熟悉的话,做这道题也会比较艰难。
/**
* @param {number} n
* @return {boolean}
*/
var isHappy = function(n) {
let s = new Set();
let m=String(n);
while(m!=='1') {
let sum=0;
for(let i of m) {
sum+=Number(i)*Number(i);
}
if(s.has(sum)) return false;
s.add(sum);
m=String(sum);
}
return true;
};
/**
* @param {number[]} nums
* @param {number} target
* @return {number[]}
*/
var twoSum = function(nums, target) {
let map = new Map();
for(let i=0;i<nums.length;i++) {
if(!map.has(target-nums[i])) {
map.set(nums[i],i);
}
else return [i,map.get(target-nums[i])];
}
};