30 天刷题计划(八)

题目来源: 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
};

本文完。

相关推荐
UrbanJazzerati4 分钟前
当网页翻页时,页码藏在哪里?——一次对分页机制的解密之旅
后端·面试
RaidenLiu4 分钟前
Flutter Platform Channel 底层架构解析 —— 从 BinaryMessenger 到跨平台消息通信机制
前端·flutter·前端框架
bluceli6 分钟前
CSS容器查询:响应式设计的新范式
前端·css
Tapir10 分钟前
被 Karpathy 下场推荐的 NanoClaw 是什么来头
前端·后端·github
前端人类学10 分钟前
深入解析JavaScript中的null与undefined:区别、用法及判断技巧
前端·javascript
ssshooter1 小时前
Tauri 项目实践:客户端与 Web 端的授权登录实现方案
前端·后端·rust
着迷不白1 小时前
Linux单用户模式密码修改与硬盘注释指南
面试
兆子龙1 小时前
【React】19 深度解析:掌握新一代 React 特性
前端·架构
Moment2 小时前
MinIO已死,MinIO万岁
前端·后端·github
无双_Joney2 小时前
心路散文 - 转职遇到AI浪潮,AIGC时刻人的价值是什么?
前端·后端·架构