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
};

本文完。

相关推荐
子非鱼a6 小时前
【WEB】multiSQL
前端
David猪大卫6 小时前
【C++修炼】智能指针使用及原理
开发语言·c++·经验分享·笔记·学习·考研·面试
2601_967760787 小时前
2026年PDF压缩与页码添加工具技术实测:性能、算法与本地化适配深度对比
算法·pdf
lemon_sjdk7 小时前
DOM 节点
java·前端·javascript
nvd117 小时前
深入现代 Web 鉴权架构:网关统一代理 (Forward-Auth) vs 前端持有 JWT 的终极选型与边缘同域实践
前端·架构·状态模式
leoZ2317 小时前
2026-09-09-springboot-cloud-deploy-pitfalls
java·前端·javascript·vue.js·人工智能·spring boot·后端
YWL7 小时前
OpenLayers弹窗Overlay深度实战
前端·vue·openlayers
不会就选b7 小时前
算法日常・每日刷题--<贪心>7
数据结构·算法·leetcode
YWL8 小时前
OpenLayers+ECharts联动:地图点击联动图表,数据可视化大屏方案
前端·信息可视化·vue·echarts·openlayers
芭拉拉小魔仙8 小时前
Vue 2 门诊收费系统中的医保结算流程设计与实践
前端·javascript·vue.js