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

本文完。

相关推荐
No8g攻城狮20 小时前
【前端】Vue 中 const、var、let 的区别
前端·javascript·vue.js
文心快码BaiduComate20 小时前
Comate搭载Kimi K2.6,长程13h!
前端·后端·程序员
豹哥学前端20 小时前
新手小白学前端day4: Position定位
前端
fishmemory7sec20 小时前
Vue大屏自适应容器组件:v-scale-screen
前端·javascript·vue.js
饺子不吃醋20 小时前
Promise原理、手写与 async、await
前端·javascript
PILIPALAPENG20 小时前
第3周 Day 2:Function Calling —— 让 Agent 听懂人话,自己干活
前端·人工智能·python
袋鼠云数栈UED团队21 小时前
基于 OpenSpec 实现规范驱动开发
前端·人工智能
JarvanMo21 小时前
GetX 作者的 GitHub 账号被封,又默默恢复了——但问题远没有解决
前端
逻辑驱动的ken21 小时前
Java高频面试考点场景题09
java·开发语言·数据库·算法·oracle·哈希算法·散列表
大黄说说21 小时前
HTML5语义化标签:从div到article与section的进化之路
前端·html·html5