1. [3,1,2,1,3] -> [1,2,3]
  2. all duplicates -> single value
  3. already unique -> sorted
  4. single element
  5. many duplicates
  6. with negative
コース一覧
コンピューターサイエンス入門:理論編
set で重複を除去する

コンピューターサイエンス入門:理論編

2 進数、論理演算、ビット演算、データ構造、計算量、メモリモデルなど、プログラミングの土台となるコンピュータサイエンスの理論知識を学べるコースです。プログラミングを始めたばかりの学習者や、CS の体系的な土台を作りたい現役エンジニアを対象としています。約 13 時間 (1 日 30 分 × 26 日) で 53 レッスンを修了でき、修了後はコードのパフォーマンスや設計判断の根拠を理解した上で実装できるようになります。

1
2進数とビット演算
01. 2進数から10進数への変換5分
02. 10進数から2進数への変換5分
03. ビットAND演算でフラグ判定5分
04. OR / XOR でフラグを操作する5分
05. popcount で 1 のビット数を数える5分
06. シフト演算で 2 倍 / 半分5分
07. 16 進数から 10 進数への変換5分
08. 第 1 章まとめクイズ5分
2
文字コードと真偽値ロジック
01. 文字 → ASCII コード5分
02. コード → 文字5分
03. UTF-8 のバイト長を返す5分
04. AND / OR の真理値表5分
05. NOT / XOR の真理値表5分
06. 含意 (→) を AND/OR/NOT で表現5分
07. ド・モルガンの法則5分
08. 第2章まとめクイズ5分
3
計算量とBig-O
01. forループの実行回数を返す5分
02. 入れ子ループの実行回数5分
03. 線形探索 (O(n))5分
04. 二分探索 (O(log n))5分
05. バブルソート5分
06. 配列の最大と最小5分
07. 累積和で範囲合計5分
08. 第3章まとめクイズ5分
4
データ構造 (基本)
01. スタック (push/pop) を実装する5分
02. キュー (enqueue / dequeue) を実装する5分
03. カッコのバランス判定 (スタック応用)5分
04. set で重複を除去する5分
05. map で出現回数を数える5分
06. 二数の和 (map で O(n))5分
07. アナグラム判定5分
08. 第 4 章クイズ — データ構造 (基本)5分
5
ファイル / メモリ / IO 概念
01. バイト → KB 変換5分
02. ディスクサイズフォーマット5分
03. キャッシュヒット率5分
04. LRU 簡易シミュレーション5分
05. エンディアンの入れ替え (uint32)5分
06. バッファ範囲チェック5分
07. 第5章まとめクイズ5分
6
ネットワークと符号化
01. Base64 エンコード後の長さ計算5分
02. URL エンコード対象文字数5分
03. IPv4 アドレスを 32bit 整数に変換5分
04. 32bit 整数を IPv4 アドレスに変換5分
05. CIDR プレフィックスからネットマスクを作る5分
06. 単純チェックサム5分
07. 第6章まとめクイズ5分
7
設計と DB 基礎
01. 重複データを 1NF に変換 (フラットなリスト化)5分
02. キーで join (map 利用)5分
03. 残高転送のトランザクション風処理5分
04. CAP の availability 模擬5分
05. URL ルーティング5分
06. 疎結合と密結合 — 依存性注入で設計を変える12分
07. コース総まとめクイズ5分

set で重複を除去する

「もう出た値か」を配列に聞くと、毎回全部なめる

重複を取り除きたいとき、真っ先に思いつくのは「結果の配列に既に入っているか調べて、入っていなければ足す」というやり方です。

Python

result = [] for v in tags: if v not in result: result.append(v)

これは正しく動きます。ただし v not in result の 1 行が曲者で、結果の配列を先頭から順に見に行きます。結果が 5000 件まで育っていれば、1 回の質問に 5000 回の比較です。

tags が 1 万件なら、比較の合計はおよそ 5000 万回。件数が 10 倍になれば 100 倍になる、あの増え方です。重複除去そのものは単純な作業なのに、「あるかどうか」を聞く相手が悪い せいで重くなっています。

「あるかどうか」だけを答える箱

そこで、位置も順番も覚えない代わりに、あるかないかだけを一瞬で答える 箱を使います。

Python

seen = set() seen.add("tokyo") seen.add("osaka") seen.add("tokyo") print(len(seen)) # 2 同じものは 2 度入らない print("osaka" in seen) # True print("kyoto" in seen) # False

in の答えが返るまでの時間は、中に何件入っていても変わりません。値そのものから置き場所を計算して、そこだけを見に行くからです。1 万件でも 100 万件でも一定です。

配列で 5000 万回かかっていた作業が、1 万回の追加で終わります。

並び順は、あとから決め直す

代わりに手放したものがあります。順番 です。

この箱は「入っている」ことしか覚えていないので、取り出したときに並ぶ順序は当てにできません。決まった順序で返したいなら、取り出したあとに自分で並べ直す必要があります。

並べ直すときは、数値を数値として比べているか確かめてください。JavaScript の既定の並べ替えは、中身を文字として比べます。

JavaScript

console.log([3, 20, 100].sort()); // [100, 20, 3] console.log([3, 20, 100].sort((a, b) => a - b)); // [3, 20, 100]

"100" は "20" より前、という文字どうしの比較になっています。数値の配列を並べるときは、比べ方を自分で渡します。

要件

  1. 戻り値は重複のない昇順ソート済み配列
  2. set / HashSet / map を使い、平均 O(n) で重複除去する (O(n^2) の二重ループは避ける)
  3. 入力配列の順序は気にせず、結果は必ず昇順

入出力例

uniqueValues([3,1,2,1,3]) → [1,2,3] uniqueValues([5,5,5,5]) → [5] uniqueValues([4,2,1,3]) → [1,2,3,4] uniqueValues([7]) → [7] uniqueValues([1,2,3,2,1,4,5,4]) → [1,2,3,4,5] uniqueValues([-1,0,-1,2,0]) → [-1,0,2]

ヒント

Python なら sorted(set(arr)) で 1 行で書ける

JS では new Set(arr) で重複除去、その後 [...set].sort((a, b) => a - b) で整数ソート

Java は HashSet<Integer> -> ArrayList -> Collections.sort -> int[] と変換する

生田 陸人
監修生田 陸人
ゆめさくエンジニア / 現役ソフトウェアエンジニア監修者プロフィールを見る →
編集 ゆめさく編集部·公開 2026/05/19·更新 2026/08/26

関連レッスン

  • map で出現回数を数える

    ハッシュマップ (dict / Map) を使って、整数配列の各値の出現回数を 1 パスで集計する。

  • 二数の和 (map で O(n))

    配列の中から和が target となる 2 つの要素のインデックスを map を使って O(n) で見つける。

  • アナグラム判定

    2 つの文字列が同じ文字の並び替えになっているか (アナグラム) を、map による文字数カウントで判定する。

  • 第 4 章クイズ — データ構造 (基本)

    スタック / キュー / set / map の基本性質と計算量を 4 択で総まとめする。

このレッスンに出てくる用語

意味があいまいなまま進んだ語は、ここから読み直せます。

  • 配列サイズ固定の同型データの集まり
  • JavaScriptWeb で動的な振る舞いを担う言語
  • 戻り値呼び出し元への返答を表す点線矢印
  • HashSetハッシュ表ベースの Set 実装
  • ループ繰り返し処理。矢印で戻すか専用記号で示す
main.py
学習モード
エディタを読み込んでいます

メモ

set で重複を除去する

⌘S で保存