目录

题目

思路

Code

题目

题目内容:

张老师组织了一场线上模拟考试,并要求考生使用学号登录网站进行考试。考试完成后张老师发现试卷提交不全,他需要找到哪些同学没有交卷。

若班级内有 N 个学生,则学号从 1 开始到 N 结束,每个学生一个学号。一个班级内学生个数不超过 80,即 0 < N <= 80。

请你编写一个程序,帮助张老师快速找到哪些学号的学生没有交卷。

输入描述:

班级内学生数量。

交卷学生的学号列表,由于是按照交卷时间排序的,学号是乱序的,同时本题确保学号是合法的,不存在小于 1 或大于 N 的学号。

输出描述:

未交卷学生的学号列表,按照学号升序排列。

 样例 1

输入:

10
1,5,3,2,6,7,8,9,10

输出:

4

说明:

班级内共有 10 人,学号 1-10,学号为 4 的学生没有交卷。

样例 2

输入:

10
9,2,3,5,6,7

输出:

1,4,8,10

说明:

班级内共有 10 人,学号 1,4,8,10 的学生没有交卷。

样例 3

输入:

10
9,1,2,4,5,3,7,8,6,10

输出:

说明:

所有学生均进行了交卷,因此输出为空字符串。

思路

整体思路:这道题的核心是找出 1 到 N 之间哪些学号没有在交卷列表里出现。

第一步:先准备一个布尔数组,用来记录每个学号是否已经交卷。

因为题目已经保证学号合法,并且班级人数不超过 80,所以不需要哈希表或排序,数组下标直接对应学号即可。

例如 submitted[4] 表示学号 4 是否已经交卷,这样判断某个学生是否交卷就是一次数组访问。

第二步:读取交卷学生列表,按逗号拆分出每个学号。

交卷列表虽然是按交卷时间排序的,顺序可能是乱的,但我们只关心某个学号有没有出现过,所以读到一个学号就把对应数组位置标记为已交卷。

第三步:从 1 到 N 顺序扫描所有学号。

如果某个学号没有被标记,说明这个学生没有交卷,把它加入答案列表。

因为扫描顺序本来就是从小到大,所以答案天然满足升序输出,不需要再额外排序。

第四步:按逗号拼接答案列表。

如果所有学号都已交卷,答案列表为空,最终输出空字符串即可。

思路配图

Code

import sys


def main():
    lines = sys.stdin.read().splitlines()
    if not lines:
        return

    n = int(lines[0].strip())
    submitted_line = lines[1].strip() if len(lines) > 1 else ""

    # 学号范围很小,直接用下标表示学号最清晰。
    submitted = [False] * (n + 1)
    if submitted_line:
        for item in submitted_line.split(","):
            # 题目保证交卷学号合法,这里只负责做出现标记。
            submitted[int(item)] = True

    missing = []
    for student_id in range(1, n + 1):
        # 顺序扫描可以同时完成升序输出要求。
        if not submitted[student_id]:
            missing.append(str(student_id))

    print(",".join(missing))


if __name__ == "__main__":
    main()

JS

const fs = require("fs");

const input = fs.readFileSync(0, "utf8").split(/
?
/);
if (input.length > 0 && input[0].trim() !== "") {
  const n = Number(input[0].trim());
  const line = input.length > 1 ? input[1].trim() : "";

  // 学号范围很小,用数组下标直接记录是否交卷。
  const submitted = Array(n + 1).fill(false);
  if (line.length > 0) {
    for (const part of line.split(",")) {
      // 题目保证学号合法,这里只做出现标记。
      submitted[Number(part)] = true;
    }
  }

  const missing = [];
  for (let id = 1; id <= n; id++) {
    // 从小到大扫描,输出顺序自然就是升序。
    if (!submitted[id]) {
      missing.push(String(id));
    }
  }

  process.stdout.write(missing.join(","));
}

【华为od机试真题Python+JS+Java+Go合集】【超值优惠】:Py/JS/Java/Go合集

【华为od机试真题Python】:Python真题题库

【华为od机试真题JavaScript】:JavaScript真题题库

【华为od机试真题Java&Go】:Java&Go真题题库

【华为od机试真题C++】:C++真题题库

【华为od机试真题C语言】:C语言真题题库

【华为od面试手撕代码题库】:面试手撕代码题库

【华为od机试面试交流群】【文章底部有二维码链接,可扫码加交流群】

华为OD机试面试交流群二维码

华为OD机试:二本院校有机会吗? 有机会,但不大,大神除外!机考分数越高越好,所以需要提前刷题。机考通过后,如果没有收到面试邀请,也不要着急,非目标院校面试邀请发的时间比较晚。非目标院校今年有点难,机试至少要考到350分,所以需要疯狂刷题,华为OD机考是有题库的,最好在考前完所有题库题目。华为OD机试:跨专业可以参加华为OD可以,但是如果你的本科院校比较差,上岸概率不大。华为OD机试:华为OD简历被锁定机试通过,性格测试也通过,但是没人联系面试,发现简历被锁定。此时需要主动去联系HR。让他帮助你查询原因。

Logo

小龙虾开发者社区是 CSDN 旗下专注 OpenClaw 生态的官方阵地,聚焦技能开发、插件实践与部署教程,为开发者提供可直接落地的方案、工具与交流平台,助力高效构建与落地 AI 应用

更多推荐