Count IP Addresses(codewar)

题目:

Implement a function that receives two IPv4 addresses, and returns the number of addresses between them (including the first one, excluding the last one).

All inputs will be valid IPv4 addresses in the form of strings. The last address will always be greater than the first one.

 

ips_between("10.0.0.0", "10.0.0.50")  ==   50 
ips_between("10.0.0.0", "10.0.1.0")   ==  256 
ips_between("20.0.0.10", "20.0.1.0")  ==  246

 

我的答案:604ms

def ips_between(start, end):
    num = 0
    re = []
    st = list(map(int, start.split(".")))
    en = list(map(int, end.split(".")))
    print(st,en)
    for i in range(len(st)):
        re.append(en[i] - st[i])
    re = re[::-1]
    for k in range(len(re)):
        num = num + 256**k * re[k]
    return num

将字符串转换为列表后,将两个列表对应未知相减,得到的值再按位数计算

1、需要将字符串转换为列表,可使用.split()方法

2、将列表中的字符串转换为整形,使用map(int,XXX)方法

3、转换出来之后为生成器,需使用list打开

 

方法二:616ms

def ips_between(start, end):
    a = sum([int(e)*256**(3-i) for i, e in enumerate(start.split('.'))])
    b = sum([int(e)*256**(3-i) for i, e in enumerate(end.split('.'))])
    return abs(a-b)

思路大致不变,优化代码。

分别计算出start和end时的地址个数,然后将个数相减。

 

方法三:655ms

def ips_between(start, end):
    return sum((int(b) - int(a)) * 256 ** i for i, (b, a) in enumerate(reversed(list(zip(end.split('.'), start.split('.'))))))

思路一致,使用enumerate+zip同时取出两列表的内容,并且可以保留i,再进行计算

注意:zip是iterator,不可以直接使用reversed进行翻转,需要先list()手动转换

 

posted @ 2021-04-14 17:13  请叫我德华  阅读(110)  评论(0编辑  收藏  举报