小苯的文章浏览
[题目链接](https://www.nowcoder.com/practice/31e5e8a1da8a4a5b84f468a53933ff25)
思路
本题要求按照首次出现的顺序输出所有不重复的用户 ID。
哈希去重 + 保序
核心思路非常简单:
- 依次读入每个用户 ID。
- 用一个哈希集合(
set)记录已经出现过的 ID。 - 如果当前 ID 不在集合中,说明是第一次出现,将其加入集合并输出(或存入结果列表)。
- 如果已经出现过,直接跳过。
由于我们是按输入顺序遍历的,第一次遇到某个 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'));
复杂度分析
- 时间复杂度:
,其中
为记录条数,
为字符串平均长度。每次哈希查找和插入为
。
- 空间复杂度:
,用于存储哈希集合和结果列表。

京公网安备 11010502036488号