**日期格式统一与排序**

2026 华为OD机试真题 7月15日华为OD上机新系统考试真题 100 分题型

点击查看华为 OD 机试真题完整目录:2026最新华为OD机试新系统卷 + 双机位C卷 真题题库目录|全覆盖题库 + 逐点算法考点详解

题目描述

在日常开发中,用户输入的日期格式五花八门。现需要你编写一个程序,能够识别多种日期格式,将其统一输出为 yyyy-mm-dd 格式,并按日期递增顺序排列。

2026 华为OD机试真题 7月15日华为OD上机新系统考试真题 100 分题型

点击查看华为 OD 机试真题完整目录:2026最新华为OD机试新系统卷 + 双机位C卷 真题题库目录|全覆盖题库 + 逐点算法考点详解

输入描述

输入为字符串数组:

字符串格式类型 示例 说明
斜杠分隔 2022/01/01、2022/1/1 月/日可能补零也可能不补零
横杠分隔 2022-01-01、2022-1-1

注意:

  1. 合法年份范围:1000 ~ 2100
  2. 输入可能包含非法格式(即非斜杠分隔或者非横杠分隔的或者横杠和斜杠混合的均为非法格式),非法格式忽略(不参与排序和输出)
  3. 不同格式的输入可能解析为同一日期,相同日期只输出一次
  4. 输入数组长度在 1 ~ 200 范围内,且单个字符串长度不超过 50,即单个字符串长度在 ~ 50
  5. 注意日期的合法性,如月份超过 12 日,二月平年有 28 天,闰年有 29 天等
  6. 年份能被 4 整除且不能被 100 整除,或者能被 400 整除都为闰年,否则都是平年

输出描述

按日期递增顺序输出字符串数组,每个日期字符串输出 yyyy-mm-dd 格式的日期。月份和日期不足两位补前导零。

若所有输入均非法,则输出仅包含一个元素且元素为 "NULL" 的字符串数组。

输出为 JSON 风格字符串数组:元素使用英文双引号,多个元素之间使用英文逗号分隔,逗号后不加空格。

输入判定规则

判断格式的优先级顺序(从高到低):

  1. 斜杠分隔:包含 /,按 yyyy/mm/dd 解析
  2. 横杠分隔:包含 -,按 yyyy-mm-dd 解析

示例1

输入

["2022/01/01","2022-1-1","20220101","1640995200","2022/1/1","2022-01-01","2022-12-31","1641081600"]

输出

["2022-01-01","2022-12-31"]

说明

  • 2022/01/01 为斜杠分隔,转成 2022-01-01
  • 2022-1-1 为横杠分隔,但月/日需要补零,转成 2022-01-01
  • 20220101 非法
  • 1640995200 非法
  • 2022/1/1 为斜杠分隔,月/日需要补零,转成 2022-01-01
  • 2022-01-01 满足条件
  • 2022-12-31 满足条件
  • 1641081600 非法
  • 调整格式后满足条件的日期经过去重排序后,输出为 2022-01-012022-12-31

示例2

输入

["2021/02/29","2021/02-20"]

输出

["NULL"]

说明

  • 输入 2021/02/29 日期非法,2021 年 2 月没有 29 日
  • 输入 2021/02-20 日期非法,斜杠和横杠混用不支持

示例3

输入

["1970/1/1"]

输出

["1970-01-01"]

说明

  • 1970/1/1 转格式后为 1970-01-01

解题思路

核心思想

逐个检查输入字符串是否满足合法日期格式。合法格式只能是全斜杠分隔或全横杠分隔,并且必须能拆成 年、月、日 三个数字部分。通过年份范围、月份范围、每月天数和闰年规则校验真实日期后,将日期统一格式化为 yyyy-mm-dd

因为统一后的日期字符串本身按年月日补零,字典序与日期递增顺序一致,所以可以放入集合去重后直接排序输出。

算法步骤

  1. 从输入数组中提取所有字符串元素。
  2. 对每个字符串判断分隔符:
    • 若包含 /,要求不包含 -,并按 / 拆分;
    • 若包含 -,要求不包含 /,并按 - 拆分;
    • 否则为非法格式。
  3. 校验拆分后必须正好三段,且三段均为数字,年份必须为 4 位。
  4. 将年月日转换为整数,检查年份是否在 1000..2100
  5. 根据闰年规则确定每月最大天数,过滤非法月份和非法日期。
  6. 将合法日期格式化为 yyyy-mm-dd 加入集合。
  7. 对集合升序排序;若为空输出 ["NULL"],否则输出排序后的字符串数组。

正确性说明

算法只接受题目允许的两类分隔符格式,并显式排除混合分隔符、无分隔符和拆分段数不为三的字符串,因此所有非法格式都会被过滤。对每个候选日期,算法继续检查年份范围、月份范围、月份对应天数和闰年 2 月 29 日规则,因此只有真实存在且满足年份范围的日期会被保留。所有合法日期都被统一成固定宽度的 yyyy-mm-dd 字符串并加入集合,保证相同日期只保留一次;最后排序输出,由于固定宽度日期字符串的字典序等价于日期顺序,因此输出满足日期递增要求。

复杂度分析

设输入数组长度为 N,合法去重后的日期个数为 K

时间复杂度:O(N + K log K),解析每个字符串为线性处理,最终需要对合法日期排序。

空间复杂度:O(K),主要用于保存去重后的合

THE END