牛客網-華爲機試刷題(二)

寫此博客是爲了記錄自己在牛客網刷題華爲機試的一些小問題,每一道題都會或多或少忘掉很多細節,找工作不易:

今天想要記錄兩道題,都是考察字符串:

一,座標移動問題,簡單說就是輸入一行字符串,然後需要讀取解析這些字符串,然後根據字符串中的AWSD以及相對應的數值進行最終的座標計算並輸出,題目描述如下:

開發一個座標計算工具, A表示向左移動,D表示向右移動,W表示向上移動,S表示向下移動。從(0,0)點開始移動,從輸入字符串裏面讀取一些座標,並將最終輸入結果輸出到輸出文件裏面。

輸入:合法座標爲A(或者D或者W或者S) + 數字(兩位以內)座標之間以;分隔。非法座標點需要進行丟棄。如AA10;  A1A;  $%$;  YAD; 等。下面是一個簡單的例子 如:

A10;S20;W10;D30;X;A1A;B10A11;;A10;

處理過程:起點(0,0)

+   A10   =  (-10,0)

+   S20   =  (-10,-20)

+   W10  =  (-10,-10)

+   D30  =  (20,-10)

+   x    =  無效

+   A1A   =  無效

+   B10A11   =  無效

+  一個空 不影響

+   A10  =  (10,-10)

結果 (10, -10)

注意請處理多組輸入輸出

示例1:

輸入: A10;S20;W10;D30;X;A1A;B10A11;;A10;

輸出:10,-10

解題思路:對於這類字符串問題,目前我覺得解題思路都是大同小異的,剛開始要進行輸入合法判斷,對於不合法的輸入要進行甄別和排除,然後進行提取有用的信息,基本就是用切片和循環判斷語句結合來進行計數、計算等操作了。

本題目首先先對於輸入的語句按照‘;’進行切片,然後對於切片之後得到的列表判斷每一個元素的值是否合法,如果是空,或者長度超過3,就認爲是錯誤輸入,就進行下一趟遍歷,如果不滿足這個條件就說明該字符串長度在3以內且不爲空,那就先判斷是不是以ASWD這四個字符爲開始,剩下的字符(或者是一個或者是兩個)都是數字,這裏判斷字符串是否爲數字的函數是isdigit()函數,除了以上非法輸入和這四個都不滿足的情況之外,就是另外一種非法輸入,比如以其他字符爲開始,或者在剩下的字符串裏面有字符出現,如:X12,A1A,AN,ABC,等等。那就執行continue,進行下一次遍歷。

具體代碼如下:

提交界面如下,第一題結束:

 

接下來是第二題,關於識別和分類有效的IP地址和掩碼問題:

題目描述其實很簡單,但是我真的是太笨了,剛開始整整一個小時看不懂題目,不知道在說啥,把我大學學的計算機網絡知識全忘記了,但後面真的恍然大悟,原來這道題考的是這個啊,就這種感覺。

題目描述:請解析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就是一個非法的掩碼)

注意二進制下全是1或者全是0均爲非法

注意:

1. 類似於【0.*.*.*】的IP地址不屬於上述輸入的任意一類,也不屬於不合法ip地址,計數時可以忽略

2. 私有IP地址和A,B,C,D,E類地址是不衝突的

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

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

示例輸入

10.70.44.68~255.254.255.0
1.0.0.1~255.0.0.0
192.168.0.2~255.255.255.0
19..0.~255.255.255.0

輸出

1 0 1 0 0 2 1

首先思路同網上的大家的思路一致,先寫好兩個判斷函數,一個是IP地址是否合法的判斷函數,一個是掩碼是否合法的判斷函數,其中IP地址判斷就是綜合題目要求裏面的,首先輸入一行字符串,經過切片操作,對'~'進行切片後獲得一個列表,對於這個列表長度必須等於4,並且列表裏面不能有空字符串,然後就是判斷每一個元素的值應該是在0-255,不然輸入依然不合法。

接下來就是判斷掩碼了,掩碼的要求很有趣,掩碼轉換成2進制後必須保證前面都是1,後面都是0,那對於每一個元素來說,因爲是8位的,所以滿足條件的就只有8種,分別是:

00000000(=0)10000000(=128)11000000(=192)11100000(=224)11110000(=240)11111000(=248)11111100(=252)11111110(=254)

這裏要注意11111111(=255)不符合要求,題目裏面掩碼的要求裏說的,全是1或者全是0不行。

判斷掩碼的時候和判斷IP地址的方法是一樣的,都是把字符串切片後判斷的,而且是一層一層,先判斷第一個8位,再判斷第二個,再判斷第三個,最後是第四個,然後輸出True或者False。

判斷完IP地址和掩碼就開始進行分類了,分類主要是根據各個元素的值來進行分類,分別歸類成ABCDE和私人IP以及錯誤的IP,然後計數。

代碼如下:

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 != '':
        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
    else:
        break
print('{} {} {} {} {} {} {}'.format(A,B,C,D,E,error,privateIp))

提交界面如下:

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章