2022-9-7

70 阅读1分钟

算法

  1. 使用双指针法,主要是数学公式的推导
  2. 快指针一开始走两步,满指针走一步,第一次相遇后,如果有环,慢指针将在环内继续走,快指针移到头部,一次走一步,两个指针最终将在入环点相遇
  3. 第一次相遇时快指针走过a+n(b+c)+b=a+(n+1)b+nc ==> a+(n+1)b+nc=2(a+b)⟹a=c+(n−1)(b+c)
  4. 上述公式可以证明,当第二次两者相遇,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]