寫此博客是爲了記錄自己在牛客網刷題華爲機試的一些小問題,每一道題都會或多或少忘掉很多細節,找工作不易:
今天想要記錄兩道題,都是考察字符串:
一,座標移動問題,簡單說就是輸入一行字符串,然後需要讀取解析這些字符串,然後根據字符串中的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))
提交界面如下: