算法
- 使用双指针法,主要是数学公式的推导
- 快指针一开始走两步,满指针走一步,第一次相遇后,如果有环,慢指针将在环内继续走,快指针移到头部,一次走一步,两个指针最终将在入环点相遇
- 第一次相遇时快指针走过a+n(b+c)+b=a+(n+1)b+nc ==> a+(n+1)b+nc=2(a+b)⟹a=c+(n−1)(b+c)
- 上述公式可以证明,当第二次两者相遇,fast走过a时,slow一定绕过n-1圈+c,即必定在入环点相遇
ts体操
First of Array
// ============= Test Cases =============
import type { Equal, Expect } from './test-utils'
type cases = [
Expect<Equal<First<[3, 2, 1]>, 3>>,
Expect<Equal<First<[() => 123, { a: string }]>, () => 123>>,
Expect<Equal<First<[]>, never>>,
Expect<Equal<First<[undefined]>, undefined>>,
]
type errors = [
First<'notArray'>
First<{ 0: 'arrayLike' }>,
]
type First<T extends any[]> = T['length'] extends 0 ? never: T[0]