题目来源: LeetCode 75 30 天 JavaScript 挑战
2623. 记忆函数
思路
闭包,声明一个 map 缓存参数和函数结果
代码
ts
function memoize(fn: Fn): Fn {
const cache = new Map()
return function(...args) {
const key = args.join(',')
if (cache.has(key)) {
return cache.get(key)
}
const val = fn(...args)
cache.set(key, val)
return val
}
}
2723. 两个 Promise 对象相加
代码
ts
async function addTwoPromises(promise1: P, promise2: P): P {
return await promise1 + await promise2;
};
1207. 独一无二的出现次数
思路
先使用 Map 储存个数,再使用 Set 去重,最后判断他们的 size 是否相等
代码
ts
function uniqueOccurrences(arr: number[]): boolean {
const cache = new Map()
for (let i = 0; i < arr.length; i++) {
let n = arr[i]
if (cache.has(n)) {
cache.set(n, cache.get(n) + 1)
} else {
cache.set(n, 1)
}
}
const values = Array.from(cache.values())
const set = new Set(values)
return cache.size === set.size
};
1657. 确定两个字符串是否接近
思路
将题目理解为判断两个字符串 "字符种类是否相同" 和 "字符频次是否相等",先判断字符种类是否相同,然后判断字符出现次数是否相同。
代码
ts
function closeStrings(word1: string, word2: string): boolean {
const c1 = Array(26).fill(0)
const c2 = Array(26).fill(0)
for (let c of word1) {
c1[c.charCodeAt(0) - 'a'.charCodeAt(0)]++
}
for (let c of word2) {
c2[c.charCodeAt(0) - 'a'.charCodeAt(0)]++
}
for (let i = 0; i < 26; i++) {
if (c1[i] + c2[i] === 0) {
continue
}
if (c1[i] === 0 || c2[i] === 0) {
return false
}
}
c1.sort((a, b) => a - b)
c2.sort((a, b) => a - b)
for (let i = 0; i < 26; i++) {
if (c1[i] !== c2[i]) {
return false
}
}
return true
};
2352. 相等行列对
思路
先用 Map 将矩阵的行统计次数,再遍历矩阵,将每一列与 Map 中的行对比求和。
代码
ts
function equalPairs(grid: number[][]): number {
const len = grid.length
const map = new Map()
for(let row of grid) {
const rowStr = row.toString()
map.set(rowStr, map.get(rowStr) ? map.get(rowStr) + 1 : 1)
}
let count = 0
for (let j = 0; j < len; j++) {
const arr = []
for (let i = 0; i < len; i++) {
arr.push(grid[i][j])
}
const arrStr = arr.toString()
if (map.has(arrStr)) {
count += map.get(arrStr)
}
}
return count
};
本文完。