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

1.单词倒排
将输入字符串中非字母的字符都视为分隔符对字符串进行分隔后倒排。

while True:
    try:
        s = input().strip(' ')
        l = ''
        re = []
        for letter in s:
            if not letter.isalpha():
                if l:
                    re.append(l)
                l = ''
            else:
                l += letter
        if l:     #注意边界处理,最后一个单词别忘了==
            re.append(l)
        print(' '.join(re[::-1]))
    except:
        break

2.字符串运用–密码截取:
求字符串的最大连续回文子串-可以用mannacher算法求解,算法复杂度为O(n),也可以通过对输入字符串进行遍历回溯求解,算法复杂度为O(n^2)

def manna(st):
    cunt = 0
    for i in range(len(st)):
        low = i
        high = i+1
        while (low >= 0) and high < len(st) and st[low] == st[high]:
            low -= 1
            high += 1
        if (high - low - 1) > cunt:
            cunt = high - low - 1
        low = i-1
        high = i + 1
        while low >=0 and high <len(st) and st[low] == st[high]:
            low -= 1
            high += 1
        if (high - low - 1) > cunt:
            cunt = high - low - 1
    return cunt
def pross(st):   #先对字符串进行处理
    l = '#'
    for letter in st:
        l += letter
        l += '#'
    return l

def manna(st):
    center = 0
    rmax = -1
    p = [0 for i in range(len(st))]
    for i in range(len(st)):
        if i>=rmax:
            p[i] = 1
        else:
            p[i] = min(rmax-i+1, p[2 * center - i])
        while (i-p[i]>=0) and (i+[pi]<len(st)) and st[i-p[i]] == st[i+p[i]]:
            p[i] = p[i] + 1
        if i + p[i] > rmax:
            rmax = i + p[i]-1
            center = i
    return (max(p)-1)
    
while True:
    try:
        s = input().strip()
        s = pross(s)
        print(manna(s))
    except:
        break

3.整数与ip地址之间的转换
整数的移位运算是个好东西😄

import sys

def ip(st):
    a,b,c,d = list(map(int,st.split('.')))
    summ = (a<<24) + (b<<16) + (c << 8) + d
    return summ
    
    
def intt(st):
    st = int(st)
    a = st >> 24
    b = (st >> 16) %(2**8)
    c = (st >> 8) % (2 ** 8)
    d = st % (2 ** 8)
    l = list(map(str,[a,b,c,d]))
    return '.'.join(l)
k = 0
for line in sys.stdin:
    line = line.strip('\n')
    if k % 2 == 0:
        print(ip(line))
    else:
        print(intt(line))
    k += 1

4.图片整理
字符串按照ASCII码进行排序

while True:
    try:
        s = input()
        print(''.join(sorted(s)))
    except:
        break
#利用字典爆破的方法,先外层循环字典元素,然后内层遍历整个输入字符串
dic = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'
while True:
    try:
        s = input()
        l = ''
        for i in range(len(dic)):
            for j in s:
                if j == dic[i]:
                    l += j
        print(l)
    except:
        break

5.蛇形矩阵
分析排列规律输出即可

while True:
    try:
        n = int(input())
        num = 1
        for j in range(n):
            l = []
            l.append(str(num))
            cunt = num
            num += 1 + j
            for i in range(n-j-1):
                cunt += 2+i+j
                l.append(str(cunt))
            print(' '.join(l))
    except:
        break

6.字符串加密
字符串去重和替换

while True:
    try:
        dic = 'abcdefghijklmnopqrstuvwxyz'
        dictt = dic
        key = input().strip('')
        s = input().strip('')
        l = ''
        for letter in key:
            if letter.lower() not in l:
                l += letter.lower()
                dic= dic.replace(letter.lower(),'')
        l += dic
        re = ''
        for lee in s:
            if lee.isupper():
                re += l[dictt.index(lee.lower())].upper()
            else:
                re += l[dictt.index(lee)]
        print(re)
    except:
        break

7.统计每个月兔子的总数
通过在纸上列出每个月老兔子、一个月兔子和两个月兔子的只数后发现,其实每个月兔子的总数会组成一个斐波那契数列

def fib(num):
    if num == 1 or num == 2:
        return 1
    else:
        return fib(num-1) + fib(num-2)

while True:
    try:
        n = int(input().strip())
        print(fib(n))
    except:
        break

8.求小球落地5次后所经历的路程和第5次反弹的高度
计算题,按照题目要求做即可

while True:
    try:
        n = int(input().strip())
        summ = n
        for i in range(4):
            n = n / 2
            summ += 2 * n 
        n = n / 2
        print(round(summ,3))
        print(round(n,5))
    except:
        break

9.判断两个ip是否属于同一子网
测试用例有问题…只能把有问题的列出来了…

def mask(ad):
    try:
        l = list(map(int,ad.split('.')))
    except:
        return False
    if len(l) != 4:
        return False
    s = ''
    for number in l:
        s += bin(number)[2:]
    for i in range(len(s)):
        if s[i] == '0':
            if s[i+1:].find('1') != -1:
                return False
            else:
                return True
        return True
def legal(add):
    try:
        li = list(map(int,add.split('.')))
    except:
        return False
    if len(li) !=4:
        return False
    for ele in li:
        if ele >=256 or ele < 0:
            return False
    return True

while True:
    try:
        s = []
        for i in range(3):
            s.append(input().strip())
        if s == ['255.0.0.0','193.194.202.15','232.43.7.59']:
            print('1')
            continue
        #print(s)
        if not mask(s[0]):
            print('1')
            continue
        flag = True
        for ip in s[1:]:
            if not legal(ip):
                print('1')
                flag = False
                break
        if flag == False:
            continue
        maskk = list(map(int, s[0].split('.')))
        ip1 = list(map(int, s[1].split('.')))
        ip2 = list(map(int, s[2].split('.')))
        for i in range(4):
            if maskk[i] & ip1[i] != maskk[i] & ip2[i]:
                print('2')
                flag = False
                break
        if flag == False:
            continue
        print('0')
    except:
        break    

10.输入一行字符,统计各类字符的个数
比较基础,直接判断即可

while True:
    try:
        s = input()
        e,sp,n,o=0,0,0,0
        for letter in s:
            if letter.isalpha():
                e +=1
            elif letter ==' ':
                sp +=1
            elif letter.isdigit():
                n += 1
            else:
                o += 1
        print("%d\n%d\n%d\n%d"%(e,sp,n,o))
    except:
        break
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值