牛客网华为机试在线训练(二)

1.数字颠倒
字符串切片操作,c语言中模除取余数输出

n = input().strip()
print(n[::-1])

2.字符串反转
同1,C语言中可以使用for循环逆序输出
3.句子逆序
数组切片操作

s = input().strip().split(' ')
print(' '.join(s[::-1]))  #s为数组所以要用到join方法。
//C语言实现
#include 
#include 
int main()
{
    char a[10000];
    gets(a);
    int j = strlen(a)-1;
    int flag = 1;
    while(j >=0)
    {
        int i=j;
        while(a[j] != ' ')
        { 
            j -- ;
            if (j == -1)
            {
                flag = 0;
                break;
            }
        }
        for(int k = j+1;k<=i;k++)
            printf("%c",a[k]);
        if(flag == 1)
            printf(" ");   //注意是""双引号。
        j --;
    }
}

4.字符串的连接最长路径查找
sort函数进行排序

n = int(input())
l = []
for i in range(n):
    l.append(input())
l.sort()
for j in l:
    print(j)

5.int型正整数在内存存储时1的个数
循环将整数与1做与运算,然后将整数右移1位。

n = int(input().strip())
s = bin(n)[2:]
print(s.count('1'))

6.购物单
动态规划问题比较复杂,单独一篇博客列出。
7.坐标移动
从(0,0)开始移动,从输入字符串读取一些坐标,计算最终结果。
比较简单,先做输入字符串合法性检查,然后进行坐标计算。

while True:
    try:
        s = input().strip().split(';')
        x,y=0,0
        for word in s:
            if len(word) in range(2,4):
                if word[0] in 'AWDS' and word[1:].isdigit():
                    if word[0] == 'A':
                        x -= int(word[1:])
                    elif word[0] == 'D':
                        x += int(word[1:])
                    elif word[0] == 'W':
                        y += int(word[1:])
                    else:
                        y -= int(word[1:])
        print(str(x)+','+str(y))  #注意输出格式!
    except:
        break

8.识别有效的IP地址和掩码并进行分类统计
统计给出的ip地址掩码对中A,B,C,D,E类地址、错误ip地址或错误掩码及私有地址的个数。
⚠️1.一个地址如果是错误掩码则直接跳过其相应的ip地址检查
⚠️2.python运算符优先级!!±法的优先级高于左右移的优先级!!以后遇到还是加括号保险
⚠️3.判断一个掩码合法的简便方法先将mask化为二进制,然后判断(mask |(mask-1)==0xFFFFFFFF!!

import sys

def valid(ip):
    ip_list = ip.split('.')
    if len(ip_list) != 4 or '' in ip_list:
        return 'err'
    if int(ip_list[0]) == 10:
        return 'ap'
    elif int(ip_list[0]) == 172 and int(ip_list[1])in range(16,32):
        return 'bp'
    elif int(ip_list[0]) == 192 and int(ip_list[1])== 168:
        return 'cp'
    elif int(ip_list[0]) in range(1,127):
        return 'a'
    elif int(ip_list[0]) in range(128,192):
        return 'b'
    elif int(ip_list[0]) in range(192,224):
        return 'c'
    elif int(ip_list[0]) in range(224,240):
        return 'd'
    elif int(ip_list[0]) in range(240,256):
        return 'e'

def isvalid(mask):
    summ = 0
    try:
        l = list(map(int,mask.split('.')))
    except:
        return False
    if len(l) != 4 or l == [0,0,0,0] or l==[255,255,255,255]:
        return False
    else:
        a = l[0]<<24
        b = l[1]<<16
        c = l[2]<<8
        summ = a + b + c + l[3]  #注意优先级==
        if summ | (summ - 1) == 0xFFFFFFFF:
            return True
        else:
            return False
a,b,c,d,e,err,pri=0,0,0,0,0,0,0
for line in sys.stdin:
    if line == '\n':
        break
    ip,mask = line.strip('\n').split('~')
    if not isvalid(mask):  #先判断掩码正确性
        err += 1
    elif valid(ip) == 'ap':
        a += 1
        pri += 1
    elif valid(ip) == 'bp':
        b += 1
        pri += 1
    elif valid(ip) == 'cp':
        c += 1
        pri += 1
    elif valid(ip) == 'a':
        a += 1
    elif valid(ip) == 'b':
        b += 1
    elif valid(ip) == 'c':
        c += 1
    elif valid(ip) == 'd':
        d += 1
    elif valid(ip) == 'e':
        e += 1
    elif valid(ip) == 'err':
        err += 1
print(a,b,c,d,e,err,pri)

9.简单错误记录
⚠️1.split(’\’)用\进行分隔时,要注意将\进行转义。
⚠️2.输出最后出现的八条错误记录!即如果一个记录如果在之前出现过,假设它在倒数第二次又出现就不算在最后出现的八条错误记录中
⚠️3.净文件名称即最后一个\后的名称和行号都保持一致即视为同一条记录!(好像不太合常理==)
⚠️4.用字典存储错误记录时,因为字典是无序的所以输出字典中的最后八条记录可能不是最后出现的八条记录,所以要另外定义一个列表存储记录的出现顺序。

dic = {}
l = []
s = []
while True:
    try:
        a = input()
        a = a.split('\\')
        f = a[-1].split(' ')
        if len(f[0]) > 16:
            f[0] = f[0][-16:]
        fname = f[0] + ' ' + f[-1]
        if a[-1] not in s:
            s.append(a[-1])
            dic[fname] = 1
            l.append(fname)
        else:
            dic[fname] += 1
    except:
        break
if len(l) > 8:
    for key in l[-8:]:
        print(key,dic[key])
else:
    for key in l:
        print(key,dic[key])

10.密码验证合格程序:
判断所给的字符串是否为合格密码,按照题目要求一步步实现即可。

def pwd(st):
    if len(st)<=8:
        return False
    cunt = [0 for i in range(4)]
    for i in st:
        if i.isupper() and cunt[0]==0:
            cunt[0] += 1
        elif i.islower() and cunt[1] == 0:
            cunt[1] += 1
        elif i.isdigit() and cunt[2] == 0:
            cunt[2] += 1
        elif cunt[3] == 0:
            cunt[3]+=1
        if sum(cunt) >= 3:
            break
    if sum(cunt)<3:
        return False
    flag = True
    for i in range(len(st)):
        if st[i+3:].find(st[i:i+3]) != -1:
            flag = False
            break
    if flag:
        return True
import sys
for line in sys.stdin:
    line = line.strip('\n')
    if pwd(line):
        print('OK')
    else:
        print('NG')

看大佬用正则表达式匹配做了这道题,很简单,贴出来学习一下
r'(.{3,}).*\1'正则表达式,.即任意字符,.{3,})表示至少3个的任意字符组成的字符串组合,\1表示第一个匹配集合.{3,})相同的字符串,所以这个正则表达式即为满足[组合] …[组合]这一匹配模式的字符串,即输入字符串中长度超过2的重复子串。

'''
链接:https://www.nowcoder.com/questionTerminal/184edec193864f0985ad2684fbc86841?f=discussion
来源:牛客网
'''
import re
try:
    while 1:  
        s = raw_input()
         
        a = re.findall(r'(.{3,}).*\1', s)#包含长度超过2的重复子串
        b1 = re.findall(r'\d', s) #匹配数字
        b2 = re.findall(r'[A-Z]', s)#匹配大写字母
        b3 = re.findall(r'[a-z]', s)#小写字母
        b4 = re.findall(r'[^0-9A-Za-z]', s)#其他
 
        print 'OK' if ([b1, b2, b3, b4].count([]) <= 1 and a == [] and len(s) > 8) else 'NG'
      
except:
    pass

你可能感兴趣的:(python)