2022-9-3

66 阅读1分钟

算法

  1. 确定数据结构

    1. 需要保证顺序关系,数组,链表 频繁增删O(1)->链表
    2. 对数据读取时,时间复杂度O(1)=>使用哈希表,最终采用双向链表+哈希表
    3. 双向链表按最后一次访问的顺序排序
    4. 哈希表,以key为键,以链表节点地址为值
  2. put操作 通过哈希表查看传入的key是否对应链表节点

    1. 如果存在
      1. 将链表节点值更新
      2. 将该链表节点调整至链表头部
    2. 如果不存在
      1. 容量未满,生成新节点,调整至头部
      2. 容量已满,删除尾节点,新生成节点,将该节点调整至链表头部
      3. 将新生成的节点,存入哈希表
  3. get操作,通过哈希表,查看传入的关键字对应的链表节点

    1. 节点存在,将节点调整至头部,返回值
    2. 节点不存在,返回null
  4. 上面是通用的思路,具体到js语言特性上,可以利用Map这个数据结构本身保留set属性顺序的特点更方便的实现

TS -体操

Pick的实现

从接口中分离出部分属性组成新的接口,利用keyof Operator 和Mapped Types部分内容

import type { Equal, Expect } from './test-utils'

type cases = [
  Expect<Equal<Expected1, MyPick<Todo, 'title'>>>,
  Expect<Equal<Expected2, MyPick<Todo, 'title' | 'completed'>>>,
  // @ts-expect-error
  MyPick<Todo, 'title' | 'completed' | 'invalid'>,
]

interface Todo {
  title: string
  description: string
  completed: boolean
}

interface Expected1 {
  title: string
}

interface Expected2 {
  title: string
  completed: boolean
}


// ============= Your Code Here =============
type MyPick<T, K extends keyof T> = {
  [property in K]: T[property]
}