简介这份资源是面向计算机专业初学者与编程入门学习者的程序设计基础 OJ 题库合集源自南京信息工程大学NUIST课程实践适合正在学习 C 或 Java 语法、希望系统训练算法设计与数据结构应用的学生使用。压缩包整体约 482.72MB内容围绕在线评测平台上的练习题目与工作空间文件组织涵盖排序、二分查找、深度优先与广度优先搜索、最短路径、最小生成树、动态规划等经典算法题型以及数组、链表、栈、队列、树、哈希表等数据结构的实际运用场景可帮助读者在提交代码、查看评测反馈的过程中理解时间与空间复杂度评估逐步养成将复杂问题分解为可解决子问题的思维习惯。目前已有 754 人学习下载适合作为课程配套练习与自主刷题的参考材料也便于回顾解题思路、对照测试数据排查错误为后续软件开发与 IT 相关工作打下编程基础。1. 从一道题开始零基础也能上手的 OJ 题库到底是什么刚接触编程的人常有一个困惑书看了不少视频也刷了一堆可一合上电脑连“输入两个数、输出它们的和”都写不利索。问题不在你笨而在于编程是门手艺活光看不动手永远学不会。OJ 题库就是解决这个问题的——OJ 是 Online Judge 的缩写中文常叫“在线评测系统”你写一段代码提交上去系统自动用一批测试数据跑你的程序对了给你通过错了告诉你错在哪。这套“程序设计基础 OJ 题库”面向的就是零基础入门者题目从变量、循环、数组一路排到基础算法难度是阶梯式的你不需要先学完所有语法才能开始第一道题可能只是让你输出一行字。它适合刚学编程的学生、想转行但不知道从哪练起的人以及任何“看得懂代码但写不出来”的自学者。说白了它就是一个不知疲倦的陪练你写它判错了重来直到你真正会写为止。2. 为什么零基础要先刷 OJ把“看懂”变成“写对”2.1 看懂和写对之间隔着一条河很多人学编程的路径是看教材、看视频、跟着敲一遍示例代码觉得“嗯我懂了”。但真给一道新题脑子就空了。这不是记性问题而是编程能力本质上是一种“输出能力”——你得把解决问题的思路翻译成计算机能执行的精确指令中间任何一步含糊都不行。OJ 题库的价值在于它逼你完成这个翻译过程。每道题都有明确的输入格式、输出格式和边界条件你不能“大概这样”必须精确。比如题目说“输入两个整数输出它们的和”你就得考虑两个数之间有没有空格要不要换行如果输入是负数呢这些细节在看书时很容易被跳过但在 OJ 上一个格式错误就是“格式错误”或“答案错误”系统不会跟你讲情面。正是这种“不讲情面”让你被迫把每个细节想清楚而这个过程才是真正学会编程的地方。2.2 即时反馈是新手最需要的东西自学编程最大的痛苦是“不知道自己写得对不对”。没有老师批改没有同学对比写完一段代码运行一下输出看着差不多就以为对了。但 OJ 给你的是即时、客观的反馈提交之后几秒钟结果就出来了——通过、答案错误、格式错误、运行超时、编译错误每种结果都指向不同的问题。这种反馈循环非常短你改一版、交一版、看结果、再改一个下午能迭代几十次。我带过的新手里进步最快的往往不是看书最多的而是刷题最勤的。因为每次提交都是一次“考试”每次错误都是一次“诊断”你不需要等别人告诉你哪里不对系统直接告诉你“这组数据你输出的是 5正确答案是 6”你回去看代码发现是循环边界写错了。这种学习效率比看十遍书都高。2.3 从第一题开始难度是爬楼梯不是跳悬崖零基础的人最怕一上来就遇到“写一个快速排序”这种题直接劝退。这套题库的设计逻辑是阶梯式的前几道题可能只是“输出 Hello World”或者“读入一个数再原样输出”让你先熟悉提交格式和基本输入输出然后慢慢过渡到条件判断、循环、数组、字符串处理再往后才是排序、查找、简单递归这些基础算法。你不需要提前学完所有语法才能开始遇到不会的语法现查现学反而记得更牢。我建议的节奏是每天刷 2 到 3 道从最简单的开始不要跳题。跳题的结果往往是卡在中档题上半天过不去挫败感太强。按顺序来每道题花 20 到 40 分钟做不出来先看提示或讨论如果题库有的话实在不会再放一放第二天回头看可能就通了。这个节奏对零基础的人最友好既不至于太轻松觉得无聊也不至于太难直接放弃。2.4 刷题刷的是什么三种能力同步长刷 OJ 题表面上看是在练“写代码”实际上同时练三种能力。第一是语法熟练度你会在反复写for循环、if判断、数组下标的过程中把这些语法变成肌肉记忆不用再想“分号要不要加”“括号怎么配对”。第二是问题拆解能力一道题说“判断一个数是不是素数”你得先想清楚素数的定义大于 1 且只能被 1 和自身整除再想怎么用循环去验证最后处理边界情况比如输入是 1 怎么办。这个“读题→拆解→编码→验证”的流程刷多了就会变成条件反射。第三是调试能力程序错了你得会看错误类型、会自己造测试数据、会逐步缩小问题范围。这三种能力加起来就是“能独立写程序”的基本盘。而 OJ 题库的好处是它把这三项训练打包在每道题里你不需要刻意去练刷着刷着就长上去了。3. 第一个例子怎么跑从注册到提交的完整流程3.1 先搞清楚你面对的是什么界面打开这套 OJ 题库的页面你通常会看到几个区域题目列表按编号排列每道题有标题和通过率、题目详情页包含题目描述、输入格式、输出格式、样例输入输出、代码提交区选语言、贴代码、点提交、以及提交记录页看你每次提交的结果。不同平台的界面布局略有差异但核心元素就这几样。零基础的人第一次进去容易懵不知道该点哪里。我的建议是先别急着写代码花五分钟把题目列表翻一翻随便点开两三道题看看题目长什么样再点开一道最简单的题把“样例输入”和“样例输出”读一遍。样例输入就是系统会喂给你程序的测试数据样例输出就是你程序应该打印出来的结果。看懂这个对应关系你就知道题目要你干什么了。3.2 第一道题读两个数输出它们的和找一道编号最小的题通常就是“AB Problem”这类。题目描述大概是输入一行包含两个整数 a 和 b用空格隔开输出一行包含一个整数即 ab 的值。样例输入是1 2样例输出是3。你现在要做的是用你会的语言写一段程序从标准输入读两个整数相加打印结果。以 Python 为例代码长这样# 读入一行按空格拆成两个字符串再转成整数 a, b map(int, input().split()) # 相加后打印print 默认会换行 print(a b)这段代码只有两行但每行都有讲究。第一行input()读一整行输入返回的是字符串比如1 2.split()按空格把它切成[1, 2]map(int, ...)把列表里每个元素转成整数最后a, b ...把两个整数分别赋给 a 和 b。第二行print(a b)把和打印出来print默认在末尾加换行符正好符合题目“输出一行”的要求。如果你用 C 语言写法是#include stdio.h int main() { int a, b; // scanf 按格式读入两个整数%d 表示十进制整数 scanf(%d %d, a, b); // printf 输出结果并换行 printf(%d\n, a b); return 0; }C 版本里scanf(%d %d, a, b)的不能丢它表示把读到的值存到变量 a 和 b 的地址里printf(%d\n, ...)里的\n是换行符不加的话有些平台会判格式错误。两种语言写法不同但逻辑完全一样读两个数、相加、输出。你选自己正在学的那门语言就行不用纠结哪门更好。3.3 提交之后看什么五种结果的含义点提交之后系统会返回一个结果。新手最常见的是这五种通过Accepted简称 AC说明你的程序在所有测试数据上都跑出了正确结果答案错误Wrong AnswerWA说明程序能跑但某些数据算错了通常是逻辑问题格式错误Presentation Error说明结果数值对了但空格、换行不对比如多打了一个空格编译错误Compilation Error说明代码有语法问题编译器根本没通过看错误信息改就行运行错误Runtime Error说明程序跑着跑着崩了常见原因是数组越界、除以零、递归太深。第一次提交大概率不是 AC这太正常了。看到 WA 不要慌先拿样例输入自己跑一遍看输出对不对如果样例对了但提交 WA说明有隐藏的边界数据你没考虑到比如输入是 0 或者负数的情况。3.4 本地怎么自测自己造数据比等系统快提交之前最好在本地先跑一遍样例。以 Python 为例把代码存成a.py然后在终端里运行python a.py手动输入1 2回车看输出是不是3。如果对了再试几组自己编的数据0 0应该输出0-1 5应该输出41000000 2000000应该输出3000000。这些边界数据能帮你提前发现大部分问题。C 语言的话编译命令是gcc a.c -o a然后运行./a。本地自测的好处是快——你改一行代码就能立刻验证不用等系统排队。我建议养成习惯每改一次代码先在本地跑样例和自己造的两三组数据确认没问题再提交。这样提交次数少通过率高心态也稳。4. 新手避坑这五个坑我见一次说一次4.1 坑一输出多了或少了一个换行现象样例输入跑出来结果看着一模一样提交却报“格式错误”或“答案错误”。原因题目要求“输出一行”你的程序可能多打了一个空格、少打了一个换行或者行末多了空格。OJ 的比对是逐字符的肉眼看不出来但系统能查出来。解决严格对照样例输出用print时注意不要额外加空格C 语言里printf(%d\n, x)的\n别漏也别多打。不确定的时候把输出复制到文本编辑器里打开“显示不可见字符”看一眼行尾有没有多余空格。4.2 坑二只测了样例没测边界现象样例过了提交 WA。原因样例通常只给一组普通数据但系统会用很多组数据测你包括 0、负数、最大值、最小值这些边界情况。你的代码在普通数据上对在边界上就翻车。解决每道题写完自己列三到五组边界数据手动跑一遍。比如求和题就测0 0、-5 3、两个很大的数判断素数的题就测1、2、4、97。这个习惯能帮你挡掉大部分 WA。4.3 坑三数组开小了或者下标越界现象本地跑小数据没事提交报“运行错误”或者结果莫名其妙。原因题目说“输入 n 个数n 不超过 1000”你开了int a[100]数据一大就写越界了或者循环写for(i1; in; i)但数组是从 0 开始的最后一个元素访问到了a[n]这个不存在的位置。解决数组大小按题目上限的 1.5 到 2 倍开比如上限 1000 就开a[2000]循环下标从 0 开始就用i n从 1 开始就确认数组也开到n1。这个坑几乎每个新手都踩过踩一次记住就行。4.4 坑四读入格式没对齐题目要求现象程序在本地手动输入能跑提交就 WA 或运行错误。原因题目说“第一行一个整数 n第二行 n 个整数”你的代码可能只读了一行或者用input()读多行时没处理好换行。Python 里input()一次读一行读 n 个数得循环 n 次或者用sys.stdin.read().split()一次性读全部。解决先把题目的输入格式逐字读一遍数清楚有几行、每行几个数、用什么分隔。Python 处理多行输入的稳妥写法是data sys.stdin.read().split()把所有 token 读成一个列表再按顺序取不用操心换行问题。4.5 坑五死循环导致超时现象提交后一直显示“运行中”最后报“运行超时”。原因循环条件写错了比如while(i n)里面忘了i或者for循环的边界写反了程序永远出不来。解决写完循环先肉眼检查一遍有没有改变循环变量的语句本地跑的时候如果程序卡住不输出按 CtrlC 强制停掉说明就是死循环。另外即使不是死循环算法效率太低也会超时比如用两层循环去数一亿个数这时候得换思路但那是后面的事了新手先把死循环排掉。5. 下一步学什么从会写一题到会写一类题刷完前二十道基础题之后你大概已经熟悉了提交流程、基本输入输出、条件判断和循环。这时候最容易出现的状态是“能过题但不知道为什么过”或者“换个题型就不会”。下一步的重点不是继续盲目刷数量而是开始有意识地归类。我的建议是把题目按知识点分组输入输出一组、循环与条件一组、数组与字符串一组、排序与查找一组、简单递归一组。每做完一组停下来花十分钟写个三五行的小笔记记下这组题反复用到的写法——比如“读 n 个数用循环”“找最大值先设第一个为最大再逐个比”“字符串反转可以用切片”。这个笔记不用给别人看自己看得懂就行它的作用是把你做题时临时查的东西固化下来。具体到学习路径我建议按这个顺序推进先把循环和数组刷熟这是后面所有内容的地基然后学排序冒泡、选择、插入都行先会一个因为很多题本质上是“排序后就好办了”再学简单的字符串处理长度、比较、反转、查找子串最后碰递归从“求阶乘”“斐波那契数列”这种最简单的开始。每进入一个新分组先找两道最简单的题做建立手感再逐步加难度。不要在一个分组里死磕最难的题卡住超过四十分钟就去看别人的思路如果题库有题解的话看懂之后关掉题解自己重写一遍能独立写出来才算真的会了。还有一个很实用的技巧同一道题用两种语言各写一遍。比如你先用 Python 过了某道题再用 C 写一遍。你会发现 Python 里一行a, b map(int, input().split())在 C 里要写scanf加取地址符Python 的列表切片在 C 里要手动循环拷贝。这种对比会让你真正理解“语言只是工具逻辑才是核心”也会让你对内存、类型这些概念有更具体的感知。我带的新手里愿意做这个练习的人后来换语言都不怎么痛苦因为底层思维是通的。最后说个我自己的教训。我刚开始刷题的时候追求的是“通过数”看到 AC 就赶紧下一题结果刷了两百道之后遇到稍微变形的题还是不会。后来我强迫自己改了个习惯每道题 AC 之后花两分钟问自己三个问题——这道题的核心步骤是哪几步如果输入范围变大十倍我的写法还撑得住吗如果题目条件改一个字我要改哪里就这两分钟让我的通过率从“碰运气”变成了“有把握”。从那以后我每次刷完一组题都强制走一遍这个复盘哪怕只写一句话。希望这个习惯也能帮到你从第一道 AB 开始一题一题把地基打牢。本文还有配套的精品资源点击获取