アルゴリズム概要

すべての配列に対して .last() メソッドを呼び出せるように拡張し、配列の最後の要素を返します。配列が空の場合は -1 を返します。

入出力例

入力: nums = [null, {}, 3]
出力: 3

入力: nums = []
出力: -1

制約条件

  • arr は有効なJSON配列
  • 0 <= arr.length <= 1000

戦略のポイント

  • Array.prototype への直接拡張: すべての配列インスタンスで利用可能
  • O(1) 時間計算量: length プロパティとインデックスアクセスのみ
  • 型安全性: TypeScript で T | -1 として表現
  • Pure な実装: 元の配列に副作用なし

ステップバイステップ解説

TypeScript 実装

declare global {
  interface Array<T> {
    last(): T | -1;
  }
}

Array.prototype.last = function<T>(this: T[]): T | -1 {
  return this.length ? this[this.length - 1] : -1;
};

export {};

フローチャート

開始 this.length truthy? いいえ -1 を返す (空配列) はい インデックス計算 index = length - 1 要素アクセス this[index] 要素を返す (型 T) 終了

フローの説明:
1. メソッド呼び出し時、配列の length プロパティをチェック
2. length が 0(falsy)なら -1 を返す
3. length が正(truthy)なら length - 1 のインデックスで要素にアクセス
4. アクセスした要素を返す(型 T)

計算量分析

項目 本実装 説明
時間計算量 O(1) length プロパティアクセスとインデックスアクセスのみ
空間計算量 O(1) 追加メモリ不要、一時変数なし
副作用 なし 完全に Pure、元の配列は不変

最適化ポイント

  • truthy チェック: this.length === 0 よりも this.length の方が微小に高速
  • インデックス直接アクセス: this[index] は V8 で最も最適化されたパス
  • 型推論: TypeScript で配列の要素型を自動的に保持