3243 - FlattenDepth(带思路)
题目要求写一个深度打平,并规定打平层数的类型。我们可以逐步简化问题,再慢慢添加条件来实现。我们先不考虑打平层数,只考虑深度打平。同样,写深度打平之前,我们先看看打平一层怎样实现: ```ts type FlattenOnce<T extends any[]> = T extends [infer F, ...infer R] ? F extends any[] ? [...F, ...FlattenOnce<R>] : [F, ...FlattenOnce<R>] : T ``` 那么深度打平,其实就是将打平的操作,进行递归。那么上面代码那里进行打平了呢?那就是 `...F`,因此我们只要递归这里就可以了: ```ts type FlattenDepth<T extends any[]> = T extends [infer F, ...infer R] ? F extends any[] ? [...FlattenDepth<F>, ...FlattenDepth<R>] : [F, ...FlattenDepth<R>] : T ``` 现在考虑下层数问题,ts 中需要比较具体的数字类型,通常都需要数组的 `length` 属性。那么我们可以增加一个数组类型参数 `U`,每次打平向它里面添加一个元素来达到 ”+1“ 的目的。然后每次递归时,判断层数和它的 `length` 是否一致,如果一致,说明打平层数够了,直接返回本身即可;否则继续递归。 ```ts type FlattenDepth< T extends any[], S extends number = 1, U extends any[] = [] > = U['length'] extends S ? T : T extends [infer F, ...infer R] ? F extends any[] ? [...FlattenDepth<F, S, [...U, 1]>, ...FlattenDepth<R, S, U>] : [F, ...FlattenDepth<R, S, U>] : T ``` 需要注意,只有 `...F` 的部分向 `U` 中添加了元素,进行了 ”+1“,因为只有这部分是**真正进行打平操作的**,而剩余参数 `R` 部分的递归,**并没有进行打平**,只是继续向后传递参数,因此这部分不 ”+1“。
Posted by Gu-Miao on Sep 2, 2022, 3:14 AM
Tags
Related issues
- struct's lifetime requirements can be bypassed via covariant field assignment
- Proposal to Reorganize the Moderation Team and Review Moderation Policies
- Progressive FPS degradation appears to be related to dota2.com — blocking the domain prevents the performance loss
- proposal: container/...: generic collection types
- Better Custom Endpoint BYOK
- A concrete policy for backward compatibility until Godot 5.0
Raise real-world problems, find people facing the same issue, and discuss solutions.2,500 issues0 comments
github (Other)
struct's lifetime requirements can be bypassed via covariant field assignment
Proposal to Reorganize the Moderation Team and Review Moderation Policies
Progressive FPS degradation appears to be related to dota2.com — blocking the domain prevents the performance loss
proposal: container/...: generic collection types
Better Custom Endpoint BYOK
A concrete policy for backward compatibility until Godot 5.0
New MTP models not supported
Tracking: 429 / Capacity Issues
3243 - FlattenDepth(带思路)
题目要求写一个深度打平,并规定打平层数的类型。我们可以逐步简化问题,再慢慢添加条件来实现。我们先不考虑打平层数,只考虑深度打平。同样,写深度打平之前,我们先看看打平一层怎样实现: ```ts type FlattenOnce<T extends any[]> = T extends [infer F, ...infer R] ? F extends any[] ? [...F, ...FlattenOnce<R>] : [F, ...FlattenOnce<R>] : T ``` 那么深度打平,其实就是将打平的操作,进行递归。那么上面代码那里进行打平了呢?那就是 `...F`,因此我们只要递归这里就可以了: ```ts type FlattenDepth<T extends any[]> = T extends [infer F, ...infer R] ? F extends any[] ? [...FlattenDepth<F>, ...FlattenDepth<R>] : [F, ...FlattenDepth<R>] : T ``` 现在考虑下层数问题,ts 中需要比较具体的数字类型,通常都需要数组的 `length` 属性。那么我们可以增加一个数组类型参数 `U`,每次打平向它里面添加一个元素来达到 ”+1“ 的目的。然后每次递归时,判断层数和它的 `length` 是否一致,如果一致,说明打平层数够了,直接返回本身即可;否则继续递归。 ```ts type FlattenDepth< T extends any[], S extends number = 1, U extends any[] = [] > = U['length'] extends S ? T : T extends [infer F, ...infer R] ? F extends any[] ? [...FlattenDepth<F, S, [...U, 1]>, ...FlattenDepth<R, S, U>] : [F, ...FlattenDepth<R, S, U>] : T ``` 需要注意,只有 `...F` 的部分向 `U` 中添加了元素,进行了 ”+1“,因为只有这部分是**真正进行打平操作的**,而剩余参数 `R` 部分的递归,**并没有进行打平**,只是继续向后传递参数,因此这部分不 ”+1“。
Comments (0)
No comments yet. Start the discussion.