解题思路
使用字符串模拟和最长连续段扫描。
将输入按冒号切成 8 个字符串组。压缩时先执行规则 2,再执行规则 1。
可被 ** 压缩的候选段需要满足:
该段由若干个连续相同的组组成,并且这个组本身 4 位字符完全相同,例如 0000、1111、aaaa。
P5104.第1题-数字标识符压缩算法
题目内容
标准的数字标识符由 128 位组成,通常表示为 8 组 4 位小写十六进制数,每组之间用冒号 (:) 分隔。例如:
- 2001:0db8:85a3:0000:0000:8a2e:0370:7334
为了提高可读性,需要对数字标识符进行压缩。
压缩规则
规则1:前导零压缩
每组 4 位小写十六进制数,前导的零可以省略
例如:0db8→db8,0370→370,0000→0
规则2:连续相同数字组压缩
连续的相同数字组(即所有位都是同一个数字,如 0000、1111、aaaa、ffff等)可以用双冒号 :: 表示,但只能使用一次
例如:2001:aaaa:bbbb:cccc:dddd:eeee:ffff:2222→2001::bbbb:cccc:dddd:eeee:ffff:2222
注意:如果有多个连续相同数字组,只能压缩最长的一组;如果长度相同,压缩左边的那一组
规则3:压缩优先级
首先应用规则 2(连续相同数字组压缩),然后应用规则 1(前导零压缩)
例如:2001:0011:2222:3333:1111:0000:0000:1111→2001:11:2222:3333:1111::1111,即先合并后压缩前导零
输入描述
- 一个字符串 identifier,表示数字标识符
- 输入保证是完整且有效的标准数字标识符(8 组,每组 4 位小写十六进制字符)
- 字符串长度固定为 39
输出描述
压缩后的数字标识符字符串
示例
| 输入 |
输出 |
| 2001:0db8:85a3:0010:0001:8a2e:0370:7334 |
2001:db8:85a3:10:1:8a2e:370:7334 |
| 1111:2222:2222:3333:4444:5555:6666:7777 |
1111:**:3333:4444:5555:6666:7777 |
| 0001:0002:0003:0004:0005:0006:0007:0008 |
1:2:3:4:5:6:7:8 |
| 2222:2222:aaaa:bbbb:2222:2222:cccc:dddd |
::aaaa:bbbb:2222:2222:cccc:dddd |
| 2001:aaaa:aaaa:aaaa:aaaa:aaaa:aaaa:2222 |
2001::2222 |
样例1
输入
2001:0db8:85a3:0010:0001:8a2e:0370:7334
输出
2001:db8:85a3:10:1:8a2e:370:7334
说明
只应用规则 1,因为没有相同数字组
样例2
输入
1111:2222:2222:3333:4444:5555:6666:7777
输出
1111:**:3333:4444:5555:6666:7777
说明
压缩最长的连续相同数字组(2222:2222)