小苯的文章浏览

[题目链接](https://www.nowcoder.com/practice/31e5e8a1da8a4a5b84f468a53933ff25)

思路

本题要求按照首次出现的顺序输出所有不重复的用户 ID。

哈希去重 + 保序

核心思路非常简单:

  1. 依次读入每个用户 ID。
  2. 用一个哈希集合set)记录已经出现过的 ID。
  3. 如果当前 ID 不在集合中,说明是第一次出现,将其加入集合并输出(或存入结果列表)。
  4. 如果已经出现过,直接跳过。

由于我们是按输入顺序遍历的,第一次遇到某个 ID 时立即输出,自然就保证了"按首次浏览顺序"的要求。

Java 中可以直接使用 LinkedHashSet,它既能去重又能保持插入顺序,一步到位。

代码

#include <bits/stdc++.h>
using namespace std;

int main() {
    int n;
    cin >> n;
    set<string> seen;
    vector<string> order;
    while (n--) {
        string s;
        cin >> s;
        if (seen.find(s) == seen.end()) {
            seen.insert(s);
            order.push_back(s);
        }
    }
    for (auto &x : order) cout << x << "\n";
    return 0;
}
import java.util.*;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        Set<String> seen = new LinkedHashSet<>();
        for (int i = 0; i < n; i++) {
            seen.add(sc.next());
        }
        for (String s : seen) {
            System.out.println(s);
        }
    }
}
n = int(input())
seen = set()
order = []
for _ in range(n):
    s = input()
    if s not in seen:
        seen.add(s)
        order.append(s)
print('\n'.join(order))
const lines = require('fs').readFileSync('/dev/stdin', 'utf8').trim().split('\n');
const n = parseInt(lines[0]);
const seen = new Set();
const order = [];
for (let i = 1; i <= n; i++) {
    const s = lines[i].trim();
    if (!seen.has(s)) {
        seen.add(s);
        order.push(s);
    }
}
console.log(order.join('\n'));

复杂度分析

  • 时间复杂度,其中 为记录条数, 为字符串平均长度。每次哈希查找和插入为
  • 空间复杂度,用于存储哈希集合和结果列表。