Java コーディング演習:配列・文字列・コレクション10
計算から始め、問題に応じて保持すべき状態がどう変わるかを追います。主要な演習には、完全な Java の解法、入力条件、アルゴリズムを選ぶ理由を示しています。
配列と数値の範囲
符号と添字の対応を確認してから int と long を選びます。続いて、積が int の範囲を超える数列を扱います。
- Java の IntStream で符号付きの値を合計する
絶対値と対応する真偽値の符号を IntStream で組み合わせます。相殺、全要素が負の場合、int の範囲、配列の長さが等しいという契約を確認します。
- Java の配列の内積:IntStream と整数の範囲
IntStream で配列の同じ位置の要素を掛けて合計します。符号、int の範囲、乗算でオーバーフローする前に型を拡張する理由を説明します。
- Java で x 間隔の数列を生成する:乗算前の型拡張
IntStream で x から x*n までの n 個の値を生成します。mapToLong だけでは int のオーバーフローを防げない理由と、正・負・ゼロの間隔を確認します。
文字列と変換の順序
数字の英単語にはリテラル置換を使い、正規化の順序を保ちます。その後、スタックで隣接する同一文字のペアを削除します。
- Java の String.replace で英語の数字名を変換する
数字と zero から nine の単語が混ざった有効な入力をリテラル置換で正規化します。replace と replaceAll の違い、整数の範囲と適用条件を説明します。
- Java の新しい ID 推薦:正規化の順序と切り詰め
Optional のチェーンとループで ID を正規化します。連続するドット、フィルター後の空文字、切り詰め後の処理、補完、ロケールへの非依存性を確認します。
- Java の ArrayDeque スタックで隣接する同一文字のペアを削除する
スタックで隣接する同一文字のペアを削除します。接頭辞の不変条件、連鎖する削除、百万文字の境界と時間・空間計算量を説明します。
個数・状態・順序
名前の出現回数と種類数を区別し、キャッシュの直近の利用順序を追います。比率の順位付けでは同率時の基準を明示します。
- Java で名前ごとの頻度から未完走者を見つける
HashMap で参加者の頻度から完走者の頻度を引きます。Set の差では扱えない同姓同名と、未完走者が一人という条件を説明します。
- Java の Ponketmon:答えが min(種類数, N/2) になる理由
HashSet で種類を数え、選択上限を達成できることを示します。最大種類数の計算と実際の選択の構築を区別します。
- Java の LRU キャッシュ:LinkedHashMap のアクセス順を使う
アクセス順の LinkedHashMap で LRU を再現し、ヒット時の更新、追い出し、大文字小文字を区別しないキー、容量ゼロ、コストモデルの前提を確認します。
- Java の失敗率ソート:分母・同率・long の積
停止人数と到達人数を数え、long の交差積で失敗率を正確に比較します。未到達のステージ、全クリア、同率時の番号順を扱います。