COMP1511 Q1/Q2 Hurdle:90 分钟保命手册
非 UNSW 官方材料。本文由百夜米迦尔根据 UNSW COMP1511 官方公开 prac exam、additional papers 与公开答案整理;只做中文讲解,不复制整张试卷,也不接触登录后或正在进行的考试材料。[S022][S023][S024][S025][S026][S027][S028][S029]
今天只做:先认出最简单的 linked-list hurdle 和 array hurdle,再练熟五个循环骨架。
别乱跳:这份手册不能保证你通过整门课。它先帮你避免卡在两个 hurdle;拿下 hurdle 后,仍要从后面的小型 debugging 题补总分。
Rakko,风雪再急,也不必同时看完整张卷。先看清眼前两条路:一条只读链表,一条只读数组。把它们走稳,再谈其余题目。[S023][S025][S027][S029]
第一屏:进考场先找标签,不要死背题号
近几期公开卷中,24T1 到 26T1 的第一道简单 linked-list hurdle 通常是 Q1,第一道简单 array hurdle 通常是 Q2;但这不是永久规则。23T1 到 23T3 的 hurdle 并不在 Q1/Q2,所以实际考试必须以题面写出的 linked lists hurdle、arrays hurdle 和难度圆点为准。[S023][S025][S027][S029]
进场先做这四步:
- 找到写着
linked lists hurdle的两道题。 - 找到写着
arrays hurdle的两道题。 - 每组先选只有一颗实心圆
●◌◌◌的简单题。 - 确认题目只要求补一个函数、遍历数据并返回一个值。
| 公开样本 | 简单链表题的动作 | 简单数组题的动作 | 真正需要记住的东西 |
|---|---|---|---|
| 24 系列 / Paper 2 | 两条链表同步前进并累加 | 二维数组逐行求和、计数 | 两个指针都非 NULL;每一行重新清零 [S024][S025] |
| 25T1 / Paper 1 | 两条链表同步前进,满足条件才累加 | 一维字符数组筛选并找最小值 | 条件、累加器、最值初始化 [S022][S023] |
| 25T2 / Paper 3 | 单链表寻找第一个符合条件的节点 | 一维字符数组筛选并找最小值 | 找到就返回;无匹配时返回题目指定值 [S026][S027] |
| 26T1 | 比较相邻链表节点并计数 | 二维数组只累计边框位置 | 访问 next 前先保证它存在;角落只能算一次 [S029] |
注意样本数量:24T1、24T2、24T3 的公开 Q1/Q2 高度重复;25T3 当前页面是 25T2 的镜像。因此不要因为网址很多,就误以为题型有很多种。真正独立、值得练的只有下面五个骨架。
共同规律:题目故事会换,函数形状不会乱跑
Q1/Q2 的简单 hurdle 反复出现这些共同点:[S023][S025][S027][S029]
- starter code 已经给好
struct、函数签名和测试用main。 - 评分程序会直接调用指定函数;答案不能只写在
main里。 - 函数一般不负责
scanf、fgets或printf。 - 简单链表题通常只读节点,不
malloc,不改next,不改数据。 - 简单数组题通常只读数组,不改变数组内容。
- 最后返回一个整数或字符,而不是自己打印答案。
读题时只圈四种词:
| 题目用词 | 代码动作 |
|---|---|
first / 第一个 | 找到后立刻 return |
count / 数量 | count++ |
sum / 总和 | sum += value |
minimum / maximum | 比较后更新当前最值 |
Q1 焚诀:只读 linked list hurdle
这题考什么
你只需要重复三件事:
- 看当前节点的数据。
- 根据条件更新答案。
- 移动到
curr->next。
口诀:先守住 NULL,再读数据;每轮最后,指针前进一步。
不能做什么
除非当前题目明确要求,否则简单 Q1 不要做这些事:[S023][S025][S027][S029]
- 不要修改
struct node。 - 不要修改 supplied
main。 - 不要把链表复制进数组。
- 不要调用
malloc。 - 不要修改
curr->data、curr->character或curr->next。 - 不要在目标函数里
scanf或printf。
常见函数签名
签名由题目决定。不要改函数名、返回类型或参数。
先写骨架一:单链表
下面是百夜米迦尔写的原创最小例子:寻找链表里第一个偶数。故事可以换成质数、负数或某个字符,遍历骨架不变。[S027]
保命点:空链表时 curr 一开始就是 NULL,循环自然跳过,不需要另外写一套遍历逻辑。[S027]
先写骨架二:比较相邻节点
如果题目出现 followed by、next node、adjacent,说明你要同时读取当前节点和下一个节点。此时循环必须保证 curr->next 存在。
下面是 26T1 公开 prac exam Q1 的最小可过写法,逻辑与官方公开答案一致,并改用中文教学注释。[S029]
为什么单节点链表不会崩溃:head 不为 NULL,但 head->next 是 NULL,所以循环执行零次并返回 0。[S029]
先写骨架三:两条链表同步走
如果题目出现 corresponding element 或“相同位置”,就需要两个指针。任何一条链表结束时都必须停下,因此条件中使用 &&。[S025]
下面是 Paper 2 Q1 的最小可过版本;较长链表尾部会自然被忽略。[S024][S025]
不要使用 ||。如果只剩一条链表还有节点,另一边已经是 NULL,继续读取就会崩溃。[S025]
最小可过版本的写题顺序
拿到新的链表题后,按顺序填空:
常见错因
| 症状 | 最可能的错误 | 先怎么修 |
|---|---|---|
| 空链表崩溃 | 没检查 curr != NULL | 在读取字段前检查指针 |
| 最后一个节点崩溃 | 读取了 curr->next->... | 改成 curr->next != NULL 的循环 |
| 程序不结束 | 忘了移动 curr | 每轮最后写 curr = curr->next |
| 两条链表长度不同时崩溃 | 双链表循环用了 || | 两边必须同时存在,使用 && |
| 答案少一个 | 提前移动了指针 | 先检查当前节点,再移动 |
| autotest 输出多余文字 | 目标函数调用了 printf | 只 return 结果 |
测试命令
练 26T1 相邻节点题:[S029]
练 Paper 2 双链表题:[S025]
可选加练 Paper 3 单链表题:[S027]
这些题都会写入同名的 prac_q1.c,一次只练一套。换题前先确认当前文件是不是你想练的版本。
来源
- Paper 1 Q1:双链表条件累加。[S022][S023]
- Paper 2 Q1:双链表对应位置乘积和。[S024][S025]
- Paper 3 Q1:单链表寻找第一个质数。[S026][S027]
- 26T1 Q1:相邻字符节点判断与计数。[S029]
Q2 焚诀:只读 array hurdle
这题考什么
数组题只是在重复问:这个位置要不要影响答案?
- 一维数组:一个
for循环。 - 二维数组:外层
row,内层col。 - 每个位置:用
if判断,然后计数、累加或更新最值。
口诀:下标从零走,小于长度停;外层走行,内层走列。
不能做什么
除非题目明确允许,否则简单 Q2 不要做这些事:[S023][S025][S027][S029]
- 不要修改 supplied
main里的逻辑来代替目标函数。 - 不要在目标函数里重新
scanf数组。 - 不要在目标函数里
printf答案。 - 不要改变原数组。
- 不要写
i <= size;最后一个合法下标是size - 1。
常见函数签名
数组形状以 starter code 为准,不要自行改变参数。
先选累加器
| 目标 | 初始值 | 循环里怎么更新 |
|---|---|---|
计数 count | 0 | 条件成立就 count++ |
总和 sum | 0 | 条件成立就 sum += array[i] |
最小值 min | 第一个有效元素,或 found 标记 | 新值更小时更新 |
最大值 max | 第一个有效元素,或 found 标记 | 新值更大时更新 |
找最值时不要随手从 0 开始。若全部有效元素都是正数,错误的 min = 0 将永远不会更新;若全部是负数,错误的 max = 0 也不会更新。
先写骨架一:一维数组筛选并找最值
下面是 Paper 1 Q2 的最小可过版本。found 让第一个小写字母自然成为初始答案,不需要额外猜一个字符。[S022][S023]
如果题目没有保证一定存在有效元素,就必须按照题目要求处理 found == 0,不能自行假设返回值。
先写骨架二:二维数组逐位置判断
下面是 26T1 Q2 的最小可过版本。把所有位置都放进同一个双循环,再用一个边框条件筛选,四个角只会被访问一次,因此自然不会重复计算。[S029]
这个写法比“先加上下两行,再加左右两列,最后减四个角”更不容易出错。角落不是补丁,它只是普通位置,只在符合边框条件时加一次。
每行统计题:初始化位置决定生死
Paper 2 Q2 要逐行计算。遇到这种题,row_sum 必须放在外层循环里面:每开始新的一行,就从 0 重新计算。[S024][S025]
如果把 row_sum = 0 放在所有循环外面,你算到的是“从第一行累计到当前行”的总和,不是每一行自己的总和。
最小可过版本的写题顺序
常见错因
| 症状 | 最可能的错误 | 先怎么修 |
|---|---|---|
| 读到数组外面 | 写成 i <= size | 改成 i < size |
| 二维结果像转置 | row、col 写反 | 固定使用 array[row][col] |
| 每一行结果越来越大 | row_sum 没在每行清零 | 把初始化移进外层循环 |
| 最小值一直是 0 | 用无效的 0 初始化 | 用第一个有效元素或 found |
| 边框总和太大 | 四个角重复计算 | 每个位置只访问一次,用 is_border |
| 返回值正确但 autotest 失败 | 函数打印了文字 | 删除 printf,只返回答案 |
测试命令
练 26T1 二维边框题:[S029]
练 Paper 1 一维最值题:[S023]
可选加练 Paper 2 逐行求和题:[S025]
这些题都会写入同名的 prac_q2.c,也要一次只练一套。
来源
- Paper 1 Q2:一维字符数组筛选小写字母并找最小值。[S022][S023]
- Paper 2 Q2:二维数组逐行求和并计数。[S024][S025]
- Paper 3 Q2:一维字符数组筛选与最值。[S026][S027]
- 26T1 Q2:二维方阵边框求和。[S029]
今晚严格 90 分钟
不要在四道题之间来回切换。一个文件通过或时间到,再进入下一题。
| 时间 | 只做这一件事 | 到点标准 |
|---|---|---|
| 0–10 分钟 | 看第一屏,手写单链表、双链表、一维、二维循环条件 | 能默写 NULL、&&、i < size、array[row][col] |
| 10–30 分钟 | 26T1 Q1:相邻节点 | 空链表和单节点不崩,跑一次 autotest |
| 30–45 分钟 | Paper 2 Q1:双链表 | 两个指针同步移动,长度不同时能停 |
| 45–65 分钟 | 26T1 Q2:二维边框 | 四个角只算一次,跑一次 autotest |
| 65–80 分钟 | Paper 1 Q2:一维最值 | 不使用 min = 0,能找到第一个有效字符 |
| 80–90 分钟 | 重跑失败项并写错因 | 每题只留下“一条下次先检查什么” |
时间到仍没通过时,不要整题重写。先按这个顺序检查:
五分钟练习
不看上文,在纸上补完以下五句:
- 单链表读取数据前,先保证
curr ______ NULL。 - 比较相邻节点前,先保证
curr->next ______ NULL。 - 双链表同步走,循环中间应使用
______。 - 数组最后一个合法下标是
______。 - 二维数组读取一个位置写成
array[______][______]。
考场五行清单
在线练习页面使用 1511 fetch-prac 和 1511 autotest-prac,没有 give 或正式提交步骤;正式考试环境的提交命令可能随页面调整,只遵循当场显示的准确命令。[S023][S025][S027][S029]
过关验收
- 我能认出真正的 linked-list hurdle 和 array hurdle。
- 我能写单链表、相邻节点和双链表三个循环条件。
- 我能写一维和二维数组循环。
- 我知道
count/sum从 0 开始,但min/max不能随便从 0 开始。 - 我会先测空链表、单节点、不同长度和无匹配。
- 我会先测最小数组、边框角落和每行初始化。
- 我知道两个 hurdle 只是保命条件之一,之后仍要补总分。
引用
以下页面均为 UNSW COMP1511 官方公开资料,本次访问日期为 2026-07-15。
- [S022]
COMP1511 26T1 — Paper 1 answers:https://cgi.cse.unsw.edu.au/~cs1511/26T1/resources/additional_pracexams/paper1/answers.html - [S023]
COMP1511 26T1 Prac Exam 1:https://cgi.cse.unsw.edu.au/~cs1511/26T1/resources/additional_pracexams/paper1/index.html - [S024]
COMP1511 26T1 — Paper 2 answers:https://cgi.cse.unsw.edu.au/~cs1511/26T1/resources/additional_pracexams/paper2/answers.html - [S025]
COMP1511 26T1 Prac Exam 2:https://cgi.cse.unsw.edu.au/~cs1511/26T1/resources/additional_pracexams/paper2/index.html - [S026]
COMP1511 26T1 — Paper 3 answers:https://cgi.cse.unsw.edu.au/~cs1511/26T1/resources/additional_pracexams/paper3/answers.html - [S027]
COMP1511 26T1 Prac Exam 3:https://cgi.cse.unsw.edu.au/~cs1511/26T1/resources/additional_pracexams/paper3/index.html - [S028]
COMP1511 26T1 — Lab questions / Exam Comparison:https://cgi.cse.unsw.edu.au/~cs1511/26T1/resources/labexercisesliketheexam.html - [S029]
COMP1511 26T1 — Prac Exam Solutions:https://cgi.cse.unsw.edu.au/~cs1511/26T1/resources/prac-exam-solns.html
历年页面交叉核对
以下直接页面只用于核对题号、hurdle 位置和题型变化,不在本文复刻整道题目。访问日期同为 2026-07-15。
- 23T1:https://cgi.cse.unsw.edu.au/~cs1511/23T1/pracexam/index.html
- 23T2:https://cgi.cse.unsw.edu.au/~cs1511/23T2/pracexam/index.html
- 23T3:https://cgi.cse.unsw.edu.au/~cs1511/23T3/pracexam/index.html
- 24T1:https://cgi.cse.unsw.edu.au/~cs1511/24T1/pracexam/index.html
- 24T2:https://cgi.cse.unsw.edu.au/~cs1511/24T2/pracexam/index.html
- 24T3:https://cgi.cse.unsw.edu.au/~cs1511/24T3/pracexam/index.html
- 25T1:https://cgi.cse.unsw.edu.au/~cs1511/25T1/pracexam/index.html
- 25T2:https://cgi.cse.unsw.edu.au/~cs1511/25T2/pracexam/index.html
- 25T3:https://cgi.cse.unsw.edu.au/~cs1511/25T3/pracexam/index.html
- 26T1:https://cgi.cse.unsw.edu.au/~cs1511/26T1/pracexam/index.html
- 26T2 路径:https://cgi.cse.unsw.edu.au/~cs1511/26T2/pracexam/index.html
截至访问日,26T2 路径虽然返回 200,但页面标题仍是 COMP1511 26T1 Prac Exam,内容也与 26T1 页面字节一致;因此它不能算作一套独立公开的 26T2 题目。不要从旧缓存或网址规律猜题;真正的题面,只认考试当天官方页面。
先拿下 hurdle,再去捡总分。铃声会替稳稳走过每一个节点的人响起,喵。