华为牛客网机试python

下方代码作者自己在牛客网上测试过,均可通过

1. 字符串最后一个单词的长度

计算字符串最后一个单词的长度,单词以空格隔开。

a = input().split(" ")
print(len(a[-1]))

2.计算字符个数

写出一个程序,接受一个由字母和数字组成的字符串,和一个字符,然后输出输入字符串中含有该字符的个数。不区分大小写。

a = input()
b = input()
print(a.lower().count(b.lower()))

3.明明的随机数

明明想在学校中请一些同学一起做一项问卷调查,为了实验的客观性,他先用计算机生成了N个1到1000之间的随机整数(N≤1000),对于其中重复的数字,只保留一个,把其余相同的数去掉,不同的数对应着不同的学生的学号。然后再把这些数从小到大排序,按照排好的顺序去找同学做调查。请你协助明明完成“去重”与“排序”的工作(同一个测试用例里可能会有多组数据,希望大家能正确处理)。

while True:
    try:
        num = int(input())
        data = []
        for i in range(num):
            a = int(input())
            data.append(a)
        data = list(set(data))
        data = sorted(data)
        for i in data:
            print(i)
    except:
        break

4.字符串分隔

连续输入字符串,请按长度为8拆分每个字符串后输出到新的字符串数组;长度不是8整数倍的字符串请在后面补数字0,空字符串不处理。

def StrSplit(a):
    while len(a) >  8:
        b = a[0:8]
        print(b)
        a = a[8:len(a)]
    print(a.ljust(8,'0'))

StrSplit(input())
StrSplit(input())

或者

def stringSplit(s):
    while len(s)>8:
        print(s[0:8])
        s = s[8:len(s)]
    print(s+(8-len(s))*'0')

stringSplit(input())
stringSplit(input())

5.进制转换

写出一个程序,接受一个十六进制的数,输出该数值的十进制表示。(多组同时输入 )

while True:
    try:
        a = input()
        print (int(a,16))
    except:
        break

PS:进制转换就是int(a,16)

6.质数因子

功能:输入一个正整数,按照从小到大的顺序输出它的所有质因子(如180的质因子为2 2 3 3 5 )

最后一个数后面也要有空格

def  zhishu(a):
    a = int(a)
    num = []
    while(a>1):
        for j in range(2,a+1):
            if a % j == 0:
                num.append(j)
                a = int(a/j)
                break
    return sorted(num)

num = zhishu(input())
for i in num:
    print(i,end = " ")

PS:注意break和end以及a每次都要更换判断是否=1

7.取近似值

写出一个程序,接受一个正浮点数值,输出该数值的近似整数值。如果小数点后数值大于等于5,向上取整;小于5,则向下取整。

#print (round(float(input())))

def rounds(a):
    if 10 * a % 10 >= 5:
        print (int(a)+1)
    else:
        print (int(a))
        
rounds(float(input()))

PS:不知为何py的round函数四舍五入只能通过90%

8.合并表记录

数据表记录包含表索引和数值(int范围的整数),请对表索引相同的记录进行合并,即将相同索引的数值进行求和运算,输出按照key值升序进行输出。

num = input()
d = {}
for i in range(int(num)):
    a = list(map(int,input().split(" ")))
    if a[0] not in d.keys():
        d[a[0]] = a[1]
    else:
        d[a[0]] += a[1]
dic_s = sorted(d.items(),key=lambda x:x[0])
for i in dic_s:
        print (i[0],i[1])

9.提取不重复的整数

输入一个int型整数,按照从右向左的阅读顺序,返回一个不含重复数字的新的整数。

str = list(map(int,input()))
a = []
for i in str[::-1]:
    if i in a:
        pass
    else:
        a.append(int(i))
for i in a:
    print(i,end="")

PS:map可以把字符串改为int

    注意题目是要按原数组去重后逆序输出而不是去重后的数组逆序输出

10.字符个数统计

编写一个函数,计算字符串中含有的不同字符的个数。字符在ACSII码范围内(0~127),换行表示结束符,不算在字符里。不在范围内的不作统计。

def is_ascii(s):
    a = []
    if "/n" in s:
        s = s.remove("/n")
    n = 0
    for c in s:
        if 0<= ord(c) <= 127 and c not in a:
            a.append(c)
            n += 1
    return n
print(is_ascii(list(input())))

PS:list删除元素可以用remove;记得数数时要去重

11.数字颠倒

描述:

输入一个整数,将这个整数以字符串的形式逆序输出

程序不考虑负数的情况,若数字含有0,则逆序形式也含有0,如输入为100,则输出为001

a = list(map(str,input()))
for i in a[::-1]:
    print (i,end="")

12.字符串反转

写出一个程序,接受一个字符串,然后输出该字符串反转后的字符串。(字符串长度不超过1000)

a = list(input())
for i in a[::-1]:
    print(i,end='')

13.句子逆序

将一个英文语句以单词为单位逆序排放。例如“I am a boy”,逆序排放后为“boy a am I”
所有单词之间用一个空格隔开,语句中除了英文字母外,不再包含其他字符

a = list(input().split(" "))
for i in a[::-1]:
    print (i,end=" ")

14.字符串连接的最长路径查找

给定n个字符串,请对n个字符串按照字典序排列。

num = int(input())
a = []
for i in range(num):
    a.append(input())
for j in sorted(a):
    print(j)

15.购物单

 
#初始化最大的总钱数和最大的希望购买的物品的个数
N,M=3200,60 
 
#将数组[0]重复N次,并重新连接成一个新的数组,也就是创建一个初始值为0的含有N个元素的一维数组
#自变量是钱数,因变量是所买物品的钱数和重要度乘积总和,且是在当前钱数下的最大总和
f=[0]*N  
 
#分组背包,每组有四种情况,a.主件 b.主件+附件1 c.主件+附件2 d.主件+附件1+附件2
#将上述四组想象成四个桶
#创建二维数组,行数为M,列数为4,且初始值均为0
v=[[0 for i in range(4)] for j in range(M)] #总钱数 
w=[[0 for i in range(4)] for j in range(M)] #总钱数和重要度的乘积
 
#获取输入的总钱数和希望购买的物品个数
n,m=map(int,input().split())
 
n=n//10  #价格为10的整数倍,节省时间
 
for i in range(1,m+1):#一共m行输入,遍历输入
    x,y,z=map(int,input().split()) #x:钱数,y:重要度,z:主件号
    x=x//10
 
    if z==0:#当前物品为主件
        for t in range(4):#将主件物品x的钱数、钱数与重要度的乘积,放入四个桶中
            v[i][t], w[i][t] = v[i][t] + x, w[i][t]+ x * y
    elif v[z][1]==v[z][0]:#如果a==b,添加附件1(如果a=b=c=d说明没有附件)
        #将附件x放入对应的主件z的b桶和d桶中
        v[z][1],w[z][1] = v[z][1] + x, w[z][1] + x * y
        v[z][3],w[z][3] = v[z][3] + x, w[z][3] + x * y
    else:#添加附件2
        #将附件x放入对应的主件z的c桶和d桶中
        v[z][2], w[z][2] = v[z][2] + x, w[z][2] + x * y
        v[z][3], w[z][3] = v[z][3] + x, w[z][3] + x * y
 
for i in range(1,m+1):#遍历物品
    for j in range(n,-1,-1): #遍历钱数
        for k in range(4):# 遍历四个桶
            if j >= v[i][k]:#当前钱数大于物品i的k桶需要的钱数
                f[j] = max(f[j],f[j - v[i][k]] + w[i][k])#放或者不放,
print(10*f[n])

17.坐标移动

while True:
    try:
        x = 0
        y = 0
        a = input().strip(";").split(";")
        for i in a:
            if len(i) == 2:
                if i[0] == 'A' and 47<ord(i[1])<58:
                    x = x-int(i[1])
                elif i[0] == 'D' and 47<ord(i[1])<58:
                    x = x+int(i[1])

                elif i[0] == 'S' and 47<ord(i[1])<58:
                    y = y-int(i[1])
                elif i[0] == 'W' and 47<ord(i[1])<58:
                    y = y+int(i[1])
            if len(i) == 3:
                if i[0] == 'A' and 47<ord(i[1])<58 and 47<ord(i[2])<58:
                    x = x-int(i[1])*10-int(i[2])
                elif i[0] == 'D' and 47<ord(i[1])<58 and 47<ord(i[2])<58:
                    x = x+int(i[1])*10+int(i[2])
                elif i[0] == 'S' and 47<ord(i[1])<58 and 47<ord(i[2])<58:
                    y = y-int(i[1])*10-int(i[2])
                elif i[0] == 'W' and 47<ord(i[1])<58 and 47<ord(i[2])<58:
                    y = y+int(i[1])*10+int(i[2])

        print (x,end = ',')
        print (y)
    except:
        break





PS:ord(),逗号前面不能有空格

19.简单错误记录

dic = {}
name = []
while True:
    try:
        a = input().strip().split(" ")
        b = a[0].split("\\")[-1]
        # print (b)
        # print (len(b))
        if len(b) >= 16:
            b = b[-16:]
            # print ("b",b)
        else:
            pass
        c = b + " " + a[-1]
        # print (c)
        if len(c) == 1:
            break
        # print ("c",c)
        if c not in dic.keys():
            name.append(c)
            # print ("name",name)
            # print ("111")
            dic[c] = 1
        else:
            dic[c] += 1
        # print (dic)

    except:
        # print ("a")
        break
# print (name)
# print (dic)
for i in name[-8:]:
    print (i,dic[i])
    # print ("22",dic[i])

PS:1.try 中如果没有if(len(c)==1)就跳不出来

         2.惊讶的发现牛客网用例对比右边才是标准的,左边是错误的。

20.密码验证合格程序

def check1(b):
    flag = 0
    for i in b:
        if i.isdigit():
            flag += 1
        elif i.isupper():
            flag += 1
        elif i.islower():
            flag += 1
        else:
            flag += 1
    if flag > 2:
        return 1
    else:
        return 0
def check2(b):
    if len(b) > 8:
        return 1
    else:
        return 0
def check3(b):
    for i in range(len(b)-3):
        # print (b.count(b[i:i+3]))
        if b.count(b[i:i+3]) > 1:
            # print ("!!!!")
            return 0
    return 1

while True:
    try:
        a = input()
        # print ("!!!  ",a)
        b = check1(a)
        c = check2(a)
        d = check3(a)
        # print (b,c)
        if b and c and d:
            print ("OK")
        else:
            print ("NG")
    except:
        break
# 准确率只有80%,不知道哪里出错了

21:简单密码

a = input()
output = []
for i in a:
    #print (i)
    # print (type(i))
    if 64 < ord(i) < 90:
        output.append(chr(ord(i)+33))
    elif ord(i) == 90:
        output.append(chr(97))
    elif i in ['a','b','c']:
        output.append(2)
    elif i in ['d','e','f']:
        output.append(3)
    elif i in ['g','h','i']:
        output.append(4)
    elif i in ['j','k','l']:
        output.append(5)
    elif i in ['m','n','o']:
        output.append(6)
    elif i in ['p','q','r','s']:
        output.append(7)
    elif i in ['t','u','v']:
        output.append(8)
    elif i in ['w','x','y','z']:
        output.append(9)
    else:
        output.append(i)
# print (str(output))
for j in output:
    print (j,end='')

PS:ASII

数字 48-57  大写字母65-90 小写 97-122

22.汽水瓶

while True:
    try:
        a = int(input())
        output = 0
        yushu = 0
        while (a > 2):
            output += int((yushu + a)/3)
            yushu1 = (yushu + a) % 3
            a = int((a + yushu) / 3)
            yushu = yushu1
            # print ("11   ",output)
        # print (a)
        # print (yushu)
        if 1 < a + yushu < 4:
            output += 1
        elif a + yushu == 4:
            output += 2
        print (output)
    except:
        break



PS:要用int,否则可能出现小数从而出错

24.删除字符串中出现次数最少的字符


while True:
    try:
        dic = {}
        output = []
        a = list(input())
        for i in a:
            if i in dic.keys():
                dic[i] += 1
            else:
                dic[i] = 1
        for i in dic.keys():
            if dic[i] == min(dic.values()):
                a.remove(i)
        print (''.join(a))
    except:
        break

PS:remove方法。input()结果是字符串,需要进行list。注意输出顺序不能改变!

  • 5
    点赞
  • 53
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值