242. 有效的字母异位词
先把一个字符串中的每个字符和次数放到map中,在用另一个字符串的每个字符和次数去消减map,最后如果map中所有字符的次数都是0,则说明是异位词,否则不是
function isAnagram(s: string, t: string): boolean {
const m = new Map<string, number>()
for (const c of s) {
m.set(c, (m.get(c) || 0) + 1)
}
for (const c of t) {
m.set(c, (m.get(c) || 0) - 1)
}
return !Array.from(m.values()).filter(e => e).length
};
349. 两个数组的交集
这个很简单,结合使用map和set就可以了
function intersection(nums1: number[], nums2: number[]): number[] {
const m = new Map<number, number>()
for (const n of nums1) {
m.set(n, (m.get(n) || 0) + 1)
}
const s = new Set<number>()
for (const n of nums2) {
if (m.get(n) && !s.has(n)) {
s.add(n)
}
}
return [...s]
};
202. 快乐数
快乐数主要有一点,就是出现了两次相同的数(循环)那就说明一定不是快乐数了,所以可以用set在一个while(true)里或递归里记录是否出现循环
function isHappy(n: number): boolean {
const s: Set<number> = new Set()
while (true) {
if (s.has(n)) {
return false
}
s.add(n)
n = sum(n)
if (n === 1) {
return true
}
}
};
function sum(n: number) {
let sum = 0
for (const c of String(n)) {
sum += Math.pow(Number(c), 2)
}
return sum
}
function isHappy(n: number): boolean {
return _isHappy(n, new Set())
};
function _isHappy(n: number, s: Set<number>) {
let sum = 0
for (const c of String(n)) {
sum += Math.pow(Number(c), 2)
}
if (sum === 1) {
return true
}
if (s.has(sum)) {
return false
}
s.add(sum)
return _isHappy(sum, s)
}
1. 两数之和
用map记录数字和索引,遍历时先找target-n是否已在map里存在,存在直接返回这两个索引就行了
function twoSum(nums: number[], target: number): number[] {
const m: Map<number, number> = new Map()
for (let i = 0; i < nums.length; i++) {
const n = nums[i]
const d = target - n
if (m.has(d)) {
return [i, m.get(d)]
}
m.set(n, i)
}
};