题目描述
在魔法学院中,每个法术版本由一个版本字符串表示,每个字符串由点号分隔的若干整数段组成,例如:主版本.次版本.补丁版本。新版本的能量通常高于旧版本,为提升法术效果,巫师们需要统计现有版本中哪些需要升级到指定的目标版本或更高版本。
版本比较规则:
· 版本号按主版本、次版本、补丁版本的顺序逐段比较。
· 如果指定版本的某个段高于现有版本的对应段,则该现有版本需要升级。
· 如果现有版本的某个段不存在,默认补为 0 参与比较。
输入格式
第一行包含一个整数 n,表示现有版本的数量,满足 1 ≤ n ≤ 10^4。
接下来 n 行,每行一个字符串,表示现有的魔法版本 currentVersions。
最后一行输入一个字符串 targetVersion,表示目标版本。
版本字符串的格式:每段由非负整数组成,数值范围为 0 ≤ 整数值 ≤ 10^9。
输出格式
输出一个整数,表示需要升级到目标版本的现有版本的数量。
样例
输入 1
4 100.200 100.200.1 100.50 100.200.3 100.200.2
输出 1
3
说明:100.200、100.200.1 的补丁版本低于目标;100.50 的次版本低于目标;100.200.3 已高于目标,无需升级。
输入 2
4 1.0.0 1.2 0.9.9 1.0.1 1.1
输出 2
3
题目解析
理解题目
这道题要求根据版本号的比较规则,统计在一组现有版本中,有多少个版本需要升级到目标版本或更高版本。版本号由若干个整数段组成,通常形如 主版本.次版本.补丁版本。比较时从左到右逐段比较,直到出现不同的段为止;若某一段不存在,假设该段为 0 参与比较。只要目标版本严格高于当前版本,当前版本就需要升级。
使用算法
字符串分割与转换:先将版本号字符串按点号 . 分割成整数数组,如 100.200 → [100, 200]。长度补齐:不同版本长度可能不同,缺失的段补 0 对齐。逐段比较:依次比较每个段的数值,目标版本严格大于当前版本即计数加一。
实现步骤
- 读取 n 与 n 个现有版本字符串,以及目标版本字符串。
- 将每个版本号 split('.') 后用 map(int, ...) 转为整数列表。
- 把当前版本与目标版本补 0 对齐到相同长度。
- 逐段比较,目标版本列表严格大于当前版本列表时计数。
- 输出需要升级的版本总数。
参考代码
import sys
def parse(v: str):
return list(map(int, v.split(".")))
def need_upgrade(cur: str, tg: str) -> bool:
a, b = parse(cur), parse(tg)
n = max(len(a), len(b))
a += [0] * (n - len(a)) # 缺失段补 0
b += [0] * (n - len(b))
return b > a # 目标严格更高才需要升级
def main():
data = sys.stdin.read().split("\n")
n = int(data[0])
cur = data[1:1 + n]
tg = data[1 + n]
print(sum(need_upgrade(c, tg) for c in cur))
if __name__ == "__main__":
main()时空复杂度
时间复杂度
O(n)
空间复杂度
O(1)