题目:
给定一个字符串,从中按如下规则找出所有的合法mac地址的数量: 合法mac地址以字符串表示时,由12位十六进制字符组成,每两个字符之间被-或:分割。十六进制字符包括0-9,a-f,A-F;同一个mac中出现的字母可以大小写混用。同一个mac地址,-与:不能混用。相同mac 地址需去重统计;注意,仅大小写、分割符不同的两个mac地址字符串视为相同,如aa-bb-12-cc-dd-ee与Aa:bB:12:CC:dd:ee视为相同。 示例1: 输入:01-02-03-04-05-06-07输出:2 解释:包含2个合法的mac地址01-02-03-04-05-06和02-03-04-05-06-07
思路:
这段代码的主要思路是找出输入字符串中所有合法的MAC地址,并从中删除所有以指定数字开头的地址。具体步骤如下:
- 将输入的MAC地址字符串转换为小写,并去除其中的分割符(如“-”或“:”)。
- 遍历处理后的字符串,截取长度为12的子串,检查子串中的字符是否都是合法的十六进制数字(0-9,a-f)。如果是,则该子串是一个合法的MAC地址。
- 将所有合法的MAC地址存储在一个集合中,以去除重复项。
- 指定一个要删除的元素的第一位数(这里是'1'),然后从集合中删除所有以这个数字开头的MAC地址。
- 最后,输出处理后的集合,并返回其长度。
测试示例中的输入字符串"01-02-03-04-05-06-07"包含两个合法的MAC地址"01-02-03-04-05-06"和"02-03-04-05-06-07",其中第一个以'1'开头,因此被删除,最后输出的集合只包含"02:03:04:05:06:07",因此函数返回值为2。
注意:这段代码有一个问题,即MAC地址的标准长度是6个字节,也就是12个字符(包括分隔符),但这段代码对输入字符串的长度没有做任何检查,如果输入字符串长度不足12个字符,会导致索引错误。
代码:
def getMacNum(macAddress):
# 将输入字符串统一转换为小写,去除分割符
macAddress = macAddress.lower().replace('-', '').replace(':', '')
# 使用集合来存储合法的mac地址,去除重复项
valid_mac_addresses = set()
# 遍历字符串,找出合法的mac地址
for i in range(len(macAddress) - 11):
sub_str = macAddress[i:i + 12]
if all(c in '0123456789abcdef' for c in sub_str):
valid_mac_addresses.add(
sub_str[:2] + '-' + sub_str[2:4] + '-' + sub_str[4:6] + '-' + sub_str[6:8] + '-' + sub_str[
8:10] + '-' + sub_str[
10:12])
# 定义要删除的元素的第一位数
first_num = '1'
# 从集合中删除所有以 first_num 开头的元素
valid_mac_addresses -= {x for x in valid_mac_addresses if x.startswith(first_num)}
# 输出删除后的集合
print(valid_mac_addresses)
return len(valid_mac_addresses)
# 测试示例
mac_address = "01-02-03-04-05-06-07"
result = getMacNum(mac_address)
print(result) # 输出: 2