算法小白,2024年2月21日,开始挑战在掘金发布“每日”系列。 (节假日可能会出门所以不算) 涉及到算法,type challenge 等,感兴趣的小伙伴可以持续关注督促互勉 🚀🚀🚀
算法
题意理解
二叉树中一层所有节点值的总和被称为层和,求一棵二叉树中第 K 大的层和
思路
遍历二叉树,求出每一层的层和,使用哈希表保存每层的集层和。最后排序返回第 K 大的层和
解题
const kthLargestLevelSum = (root, k) => {
const levelMap = new Map()
const dfs = (node, level) => {
if (!node) return
levelMap.set(level, (levelMap.get(level) ?? 0) + node.val)
dfs(node?.left, level + 1)
dfs(node?.right, level + 1)
}
dfs(root, 0)
// 转数组从大到小排序
const res = Array.from(levelMap.values()).sort((a, b) => b - a)
return k > res.length ? -1 : res[k - 1]
}
TypeChallenge
实现一个类型 AppendToObject<T, S, V> 给接口类型 T 添加字段为 S 的类型 V
interface Todo {
title: string
age: num
sex: string
}
type preview = AppendToObject<Todo, 'a', number>
const preview: preview = {
title: 'title',
age: 12,
sex: '男',
a: 12
}
思路
- 可以使用
&来合并两种接口类型 - 但是
T & R这种方式并不等于最终结果,需要做一层转换处理 - 遍历所有的 key 和 新增的 key,如果已经有值就赋值,没有值就是新增的类型
解题
type Setp1<T, S extends PropertyKey, V> = T & {
[key in U]: V
}
type Computed<T> = { [key in keyof T]: T[key] }
type Step2<T, S extends PropertyKey, V> = Computed<T & {
[key in S]: V
}>
或者一步到位
type AppendToObject<T, S extends PropertyKey, V> = {
[key in keyof T | S]: key extends keyof T ? T[key] : V
}