解题思路
这是一个集合操作问题。具体要求:
- 网页上有
个超链接,每个链接有唯一的名称
- 用户点击了
个链接,被点击的链接会变成紫色
- 需要输出剩余蓝色(未被点击)的链接名称
- 输出需要按照字典序排序
解决方案:
- 使用集合(set)存储所有链接
- 遍历被点击的链接并从集合中删除
- 最后输出集合中剩余的链接
代码
#include <cstdio>
#include <set>
#include <string>
using namespace std;
int main() {
// 读入初始链接
int n;
scanf("%d", &n);
set<string> links; // 使用set自动排序
for(int i = 0; i < n; ++i) {
char c[101];
scanf("%s", c);
links.insert(string(c));
}
// 处理点击的链接
int m;
scanf("%d", &m);
for(int i = 0; i < m; ++i) {
char c[101];
scanf("%s", c);
string clicked = c;
// 如果找到链接则删除
if(links.find(clicked) != links.end()) {
links.erase(clicked);
}
}
// 输出剩余的蓝色链接
for(const auto &link : links) {
printf("%s\n", link.c_str());
}
return 0;
}
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
// 读入初始链接
int n = sc.nextInt();
TreeSet<String> links = new TreeSet<>(); // 使用TreeSet自动排序
for(int i = 0; i < n; i++) {
String link = sc.next();
links.add(link);
}
// 处理点击的链接
int m = sc.nextInt();
for(int i = 0; i < m; i++) {
String clicked = sc.next();
links.remove(clicked);
}
// 输出剩余的蓝色链接
for(String link : links) {
System.out.println(link);
}
}
}
def solve():
# 读入初始链接
n = int(input())
links = set()
for _ in range(n):
link = input().strip()
links.add(link)
# 处理点击的链接
m = int(input())
for _ in range(m):
clicked = input().strip()
if clicked in links:
links.remove(clicked)
# 输出剩余的蓝色链接(按字典序排序)
for link in sorted(links):
print(link)
if __name__ == "__main__":
solve()
算法及复杂度
- 算法:集合操作
- 时间复杂度:
- 插入和删除操作都是
- 空间复杂度:
- 需要存储所有链接