華為機試題-識別有效的Ip地址和掩碼並分類Python實現


找個工作要會這個要會那個,真尼瑪難…

從頭開始吧,python以前沒學過但是很看好,以后用的人越來越多,畢竟太容易上手了,咱也不能落伍了,拿華為機試題練手吧!

題目:

請解析IP地址和對應的掩碼,進行分類識別。要求按照A/B/C/D/E類地址歸類,不合法的地址和掩碼單獨歸類。 

所有的IP地址划分為 A,B,C,D,E五類 

A類地址1.0.0.0~126.255.255.255; 

B類地址128.0.0.0~191.255.255.255; 

C類地址192.0.0.0~223.255.255.255; 

D類地址224.0.0.0~239.255.255.255; 

E類地址240.0.0.0~255.255.255.255 

 

私網IP范圍是: 

10.0.0.0~10.255.255.255 

172.16.0.0~172.31.255.255 

192.168.0.0~192.168.255.255 

 
子網掩碼為二進制下前面是連續的1,然后全是0。(例如:255.255.255.32就是一個非法的掩碼
 

輸入描述:

多行字符串。每行一個IP地址和掩碼,用~隔開。

輸出描述:

統計A、B、C、D、E、錯誤IP地址或錯誤掩碼、私有IP的個數,之間以空格隔開。

 
思路:
這道題網上方法很多,題目也比較簡單,我選取其中一種方法實現,
>>校驗Ip是否合規;
>>校驗掩碼是否合規;
>>Ip與掩碼均合規的情況下對Ip進行分類;
>>繼續判斷是否為私網Ip;
 
代碼:
#!/usr/bin/python
# -*- coding: utf-8 -*
import sys
A=0
B=0
C=0
D=0
E=0
error=0
privateIp=0
lastcode=['254','252','248','240','224','192','128','0']
def CheckIp(ip):
    if len(ip) !=4 or '' in ip:
        return False
    else:
        for i in range(4):
            if int(ip[i]) < 0 or int(ip[i]) > 255:
                return False
            else:
                return True
def CheckMask(mask):
    if len(mask)!=4:
        return False
    else:
        if mask[0]=='255':
            if mask[1]=='255':
                if mask[2]=='255':
                    if mask[3] in lastcode:
                        return True
                    else:
                        return False
                elif mask[2] in lastcode and mask[3]=='0':
                     return True
                else:
                     return False
            elif mask[1] in lastcode and mask[2]==mask[3]=='0':
                return True
            else:
                return False
        elif mask[0] in lastcode and mask[1]==mask[2]==mask[3]=='0':
            return True
        else:
            return False
while True:
    Input= sys.stdin.readline().strip()
    if Input == '':
        break
    ipList=Input.split('~')[0]
    maskList=Input.split('~')[1]
    ip=ipList.split('.')
    mask=maskList.split('.')
    if CheckIp(ip) and CheckMask(mask):
        if 1<=int(ip[0])<=126:
            A+=1
        if 128<=int(ip[0])<=191:
            B+=1
        if 192<=int(ip[0])<=223:
            C+=1
        if 224<=int(ip[0])<=239:
            D+=1
        if 240<=int(ip[0])<=255:
            E+=1
        if int(ip[0])==10 or (int(ip[0])==172 and 16<=int(ip[1])<=31) or (int(ip[0])==192 and int(ip[1])==168):
            privateIp+=1
    else:
        error+=1
    print(Input)
print('{} {} {} {} {} {} {}'.format(A,B,C,D,E,privateIp,error))

總結:

新手上路,所以走了很多彎路,python函數、循環均沒有{}大括號進行組織,所以如果你是像我一樣習慣用c#或Java,那剛開始大概率我尼瑪了,因為代碼沒對齊可能得出的結果會截然不同,所以多注意下吧,其他沒什么了,反正感覺只要懂點英文都能寫了…


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM