挑战 - 每日系列(Algorithm + TypeChallenge)

49 阅读2分钟

算法小白,2024年2月21日,开始挑战在掘金发布“每日”系列。 (节假日可能会出门所以不算) 涉及到算法,type challenge 等,感兴趣的小伙伴可以持续关注督促互勉 🚀🚀🚀

算法

2575. 找出字符串的可整除数组

题意理解

给一个字符串,如果对应下标可以被整数 m 整除,则下标对应的结果为 1,否则为 0, 返回最后的结果数组

// word = "998244353", m = 3
// 仅有 4 个前缀可以被 3 整除:"9"、"99"、"998244" 和 "9982443"
// [1,1,0,0,0,1,1,0,0]

思路

  • 遍历字符串,转换成整数
  • 能被 3 整除,对应索引结果值为 1
  • 直接去除会超时
  • 整数可以表示为 (a * 10 + b) % n
  • 对于可以整除的位数不用做判断,只需要从不可以整除的位数开始判断即可

解题

const divisibilityArray = (word, n) => {
  const res = new Array(word.length).fill(0)
  let value = 0
  for (let i = 0; i < word.length; i++) {
    value = (value * 10 + (word[i] - '0'))
    if (value === 0) res[i] = 1
  }
  return res
}

TypeChallenge

实现类型 ReplaceKeys<T, S, Y> ,替换联合类型 S 中,T 存在的键值,如果 Y 中不存在,则置为空

type NodeA = {
  type: "A"
  name: string
  flag: number
}

type NodeB = {
  type: "B"
  id: number
  flag: number
}

type NodeC = {
  type: "C"
  name: string
  flag: number
}

type Nodes = NodeA | NodeB | NodeC

type ReplacedNodes = ReplaceKeys<
  Nodes,
  "name" | "flag",
  { name: number; flag: string }
> // {type: 'A', name: number, flag: string} | {type: 'B', id: number, flag: string} | {type: 'C', name: number, flag: string} // would replace name from string to number, replace flag from number to string.

type ReplacedNotExistKeys = ReplaceKeys<Nodes, "name", { aa: number }> // {type: 'A', name: never, flag: number} | NodeB | {type: 'C', name: never, flag: number} // would replace name to never

思路

  • 通过分布式遍历联合类型 T
  • 判断当前类型的 key 是否存在 S 中
  • 如果存在,判断是否存在 Y 中,如果有,替换成 Y 的键值,如果没有,设置成 never
  • 如果不存在,继续使用原来的键值

解题

type ReplaceKeys<U, T, Y> = U extends U ? {
  [key in keyof U]: key extends T ? key extends keyof Y ? Y[key] : never : U[key]
} : never