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

本文完。

相关推荐
꧁༺❀氯ྀൢ躅ྀൢ❀༻꧂7 分钟前
实验4 循环结构
c语言·算法·基础题
新晓·故知32 分钟前
<基于递归实现线索二叉树的构造及遍历算法探讨>
数据结构·经验分享·笔记·算法·链表
总裁余(余登武)43 分钟前
算法竞赛(Python)-万变中的不变“随机算法”
开发语言·python·算法
小白学习日记1 小时前
【复习】HTML常用标签<table>
前端·html
Eric.Lee20211 小时前
音频文件重采样 - python 实现
人工智能·python·深度学习·算法·audio·音频重采样
huapiaoy1 小时前
Redis中数据类型的使用(hash和list)
redis·算法·哈希算法
丁总学Java1 小时前
微信小程序-npm支持-如何使用npm包
前端·微信小程序·npm·node.js
冷白白2 小时前
【C++】C++对象初探及友元
c语言·开发语言·c++·算法
yanlele2 小时前
前瞻 - 盘点 ES2025 已经定稿的语法规范
前端·javascript·代码规范
鹤上听雷2 小时前
【AGC005D】~K Perm Counting(计数抽象成图)
算法