常用OJ

首先没有排名比较,只是一个常用OJ记录,仅代表个人的观点,如果有好的推荐可以告诉我。

LeetCode

力扣。英文版,www.leetcode.com。中文版,www.leetcode-cn.com。想要提高自己的收入,来这里刷题不会错。

相对比较专业的OJ,很多程序猿,公司面试都会使用leetcode。

AtCoder

日本的 OI 网站。https://atcoder.jp/

基本每周都有线上比赛。比赛分为三个级别:ABC(AtCoder Beginner Contest),ARC(AtCoder Regular Contest)和 AGC(AtCoder Grand Contest)。

CSES

芬兰的 OI 网站。https://cses.fi/

CodeForces

简称CF。一家俄罗斯的网站,英文的。这里有很好的比赛,很好的题目,很好的选手。http://codeforces.com/

LightOJ

速度有点慢。http://lightoj.com

Croatian open competition in informatics

COCI,信息学克罗地亚公开赛,https://evaluator.hsin.hr

SPOJ

SPOJ是波兰最为出色的Online Judge之一,https://www.spoj.com/

UVA

https://onlinejudge.org/

coldility

网站做得非常漂亮。https://app.codility.com/programmers/

Patest

Programming Ablity Test。浙江大学搞的一个编程能力测试。有课程,有真题。https://www.patest.cn/practice

信息学奥赛一本通OJ

信奥入门教材提供的OJ,http://ybt.ssoier.cn:8088/。题目相对比较简单,适合初学者。包括C++语法、基础算法、数据结构、算法提供篇,历年真题。

OpenJudge

NOIP金牌教练董老师推荐的OJ,http://noi.openjudge.cn/。题目基本和一本通OJ一样。一本通本来就有两个版本,就是两个作者的。吐槽一下,一本通,有错误。

CCF OJ

计算机学会(CCF)的OJ。http://oj.noi.cn。题目按照CCF规定分级。个人觉得分级有些乱。

洛谷

目前算影响力比较大的商业公司OJ,https://www.luogu.com.cn/。题目质量很不错。个人感觉就是题目难度分类不合理,也许对零基础不是很友好。真的零基础新手营就会让你怀疑人生。

计蒜客

一个商业公司OJ,http://noi.openjudge.cn/。有出售课程,也有题库,还定期组织比赛。

hihoCoder

据说是原北大POJ的开发团队负责,https://hihocoder.com/。一样,有比赛,有题库。

牛客网

https://www.nowcoder.com/。和牛课网都某些销售有过不愉快的经历。不过客观说题库质量还是很不错的。

UOJ

http://uoj.ac/。题目质量不错。

51NOD

http://www.51nod.com/

JOYOJ

http://www.joyoi.cn/

OITIKU

https://www.oitiku.com/

VIJOS

https://vijos.org/

大视野

https://www.lydsy.com/JudgeOnline/

USACO

USA Computing Olympaid美国中学生的官方竞赛网站,美国著名在线题库,专门为信息学竞赛选手准备。train.uscao.org

北大ACM OJ

北京大学OJ。http://poj.org/

浙大OJ

浙江大学ACM OJ。https://zoj.pintia.cn/home

杭电OJ

杭州电子科技大学ACM OJ。http://acm.hdu.edu.cn/

山东理工OJ

山东理工大学OJ。https://acm.sdut.edu.cn/

中科大OJ

中国科学技术大学ACM OJ。http://acm.ustc.edu.cn/ustcoj/

哈工大OJ

哈尔滨工业大学ACM OJ。http://acm.hit.edu.cn/

Virtual Judge

通过爬虫实现的一个OJ入口大全。https://vjudge.net/

个人的小破站

菜鸟集中营。还是灌点水,欢迎大家来虐菜。http://47.110.135.197/

<think>嗯,用户想了解在线评测系统(OJ)中常用的Java数据结构,特别是编程竞赛相关的。首先,我需要回忆一下OJ系统的特点和编程竞赛中的常见问题类型。通常OJ题目会涉及算法效率,所以数据结构的选择很关键。 首先,基础的数据结构肯定是必须的,比如数组、字符串这些。Java里的数组和String类用得很多,特别是StringBuilder在处理字符串拼接时效率更高,避免频繁创建对象。这点应该要提到。 然后是集合框架里的List,比如ArrayList和LinkedList。ArrayList的随机访问快,适合查找多的场景,而LinkedList在频繁插入删除时更好,比如链表相关的题目。不过实际编程竞赛中可能更多用ArrayList,因为大部分情况下访问更频繁。 队列和栈在OJ题里也很常见,比如BFS用队列,DFS用栈或者递归。Java中的Queue可以用LinkedList实现,还有Deque双端队列,可能用来做滑动窗口或者双向BFS。栈的话一般用Deque来模拟,因为Java的Stack类已经不推荐使用了。 接下来是Set和Map,HashSet和HashMap用于快速查找和去重,TreeSet和TreeMap在需要有序的情况下使用。比如判断元素是否存在,或者统计频率,这些结构很常用。不过要注意哈希表的冲突问题,可能会影响性能,但在编程竞赛中数据规模通常可控。 优先队列,也就是堆,PriorityQueue,处理贪心算法或者Top K问题,比如Dijkstra算法里会用到。需要提醒用户注意比较器的使用,自定义排序规则。 高级数据结构比如并查集,处理连通性问题,虽然Java标准库没有内置,但可以自己实现。还有树状数组和线段树,用于区间查询和更新,这些在处理区间问题时很高效,比如区间求和、最大值等。 字符串处理相关的字典树,可能用于前缀匹配,不过实际题目中可能相对较少,但如果有的话需要自己实现节点结构。 然后,用户可能想知道在OJ中使用这些数据结构的注意事项。比如输入输出效率,Java的Scanner比较慢,用BufferedReader更好。内存管理方面,避免频繁创建对象,防止超限。还有数据规模的问题,根据题目选择合适复杂度的结构。 最后,可能需要给出一些例子,比如用ArrayList处理动态数组,HashMap统计频率,PriorityQueue解决Top K问题,并查集处理朋友圈问题等。这些例子能帮助用户更好地理解应用场景。 需要确保回答的结构清晰,分点列出常用结构,每个结构的特性和应用场景,以及注意事项。同时要引用提供的资料,比如引用[1]提到OJ系统涵盖数据结构等核心知识点,引用[2]关于Java的编译处理,可能涉及数据结构的实现。可能还要提到引用[3]中的私有训练题目提交情况,但不确定是否相关,可能不需要。 检查是否有遗漏的结构,比如图结构通常用邻接表或矩阵表示,但Java中可以用List<List<Integer>>来表示邻接表。另外,位操作相关的结构比如BitSet,可能在处理位掩码时有用,不过可能属于较高级的应用,根据用户的问题层次决定是否包含。 总之,整理这些数据结构,分基础、集合框架、高级结构,注意事项,示例应用,相关问题,确保覆盖全面,符合用户需求。</think>### 在线评测系统(OJ)中常用的Java数据结构 在线评测系统(OJ)的编程竞赛题目通常涉及高效算法实现,而数据结构的选择直接影响代码性能和解题效率。以下是Java中常用的数据结构及其应用场景: --- #### 一、基础数据结构 1. **数组(Array)** - 特性:固定大小,内存连续,支持随机访问($O(1)$时间复杂度) - 应用:静态数据存储、矩阵运算、动态规划 - Java实现:`int[] arr = new int[10];` 2. **字符串(String)** - 特性:不可变性,适合频繁读取但需注意拼接效率 - 优化:使用`StringBuilder`或`StringBuffer`进行动态修改($O(n)$拼接复杂度) - 示例:回文判断、子串匹配 --- #### 二、集合框架核心类 3. **List接口** - **`ArrayList`** - 动态数组,支持快速随机访问($O(1)$),插入/删除尾部高效($O(1)$),中间操作低效($O(n)$) - 应用:需要频繁按索引访问的场景 - **`LinkedList`** - 双向链表,插入/删除高效($O(1)$),但随机访问慢($O(n)$) - 应用:队列、栈的实现,或需要频繁中间修改的场景 4. **Queue/Deque接口** - **`LinkedList`实现队列** - 示例:BFS(广度优先搜索)中的层级遍历 - **`PriorityQueue`** - 基于堆实现,支持$O(\log n)$插入和$O(1)$获取最值 - 应用:贪心算法、Top K问题 - **`ArrayDeque`** - 双端队列,适合滑动窗口或双向BFS 5. **Set接口** - **`HashSet`** - 哈希表实现,$O(1)$查找/插入,用于去重或快速存在性判断 - **`TreeSet`** - 红黑树实现,有序集合,支持$O(\log n)$查找和范围查询 6. **Map接口** - **`HashMap`** - 哈希表存储键值对,$O(1)$时间复杂度,适合频率统计、缓存 - **`TreeMap`** - 基于红黑树,键有序,支持范围查询(如第一个大于某值的键) --- #### 三、高级数据结构(需手动实现) 7. **并查集(Disjoint Set Union, DSU)** - 功能:高效处理连通性问题($O(\alpha(n))$近似常数时间) - 应用:图的连通分量、朋友圈问题 - 示例代码: ```java class DSU { int[] parent; public DSU(int n) { parent = new int[n]; Arrays.setAll(parent, i -> i); } int find(int x) { return parent[x] = (parent[x] == x) ? x : find(parent[x]); } void union(int x, int y) { parent[find(x)] = find(y); } } ``` 8. **树状数组(Fenwick Tree)** - 功能:高效单点更新和前缀查询($O(\log n)$) - 应用:动态频率统计、逆序对计数 9. **线段树(Segment Tree)** - 功能:区间查询与更新($O(\log n)$) - 应用:区间最值、区间和 10. **字典树(Trie)** - 功能:高效存储和检索字符串集合 - 应用:前缀匹配、词频统计 --- #### 四、OJ中数据结构的注意事项 1. **输入输出效率** - 使用`BufferedReader`替代`Scanner`以减少I/O耗时[^2]。 2. **内存管理** - 避免频繁创建对象(如循环内`new ArrayList<>()`),防止内存超限。 3. **数据规模与复杂度** - 根据题目限制选择合适结构(如$n \leq 10^5$时需$O(n \log n)$算法)。 --- #### 五、示例应用场景 - **动态数组**:`ArrayList`处理不确定长度的输入数据。 - **频率统计**:`HashMap`统计字符出现次数。 - **最值问题**:`PriorityQueue`解决合并K个有序链表。 - **连通性**:并查集处理社交网络关系[^1]。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

努力的老周

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值