牛客Python在线编程练习笔记

文章目录

      • 输入输出
        • 多行输出
        • 格式化输出
        • 小数输出
      • 类型转换
      • 列表
        • 发送offer
        • 生成数字列表
        • 删除简历
        • 淘汰排名最后的学生
        • 密码游戏
      • 运算符
        • 除法与取模运算
        • 与或非逻辑运算
        • 俱乐部成员
        • 二进制运算
      • 条件语句
        • 判断列表是否为空
        • 禁止重复注册!
        • 菜单字典
      • 面向对象
        • 兔子的数量
        • 类-修改属性1
        • 类-修改属性2
      • 重载
      • 正则表达式re库
        • 正则查找网址
        • 提取数字
        • 去除注释内容

输入输出

多行输出

将字符串 ‘Hello World!’ 存储到变量str1中,再将字符串 ‘Hello Nowcoder!’ 存储到变量str2中,再使用print语句将其打印出来(一行一个变量)。

错误示范:

str1 = 'Hello World!'
str2 = 'Hello Nowcoder!'
print(str1,"\n",str2)

输出结果:

Hello World!    
 Hello Nowcoder!

第二行会多出来一个空格,可以改用sep函数将’\n’充当分割符:

str1 = 'Hello World!'  
str2 = 'Hello Nowcoder!'
print(str1,str2,sep="\n")

python中’'和""没什么区别,单引号表示的字符串里可包含双引号,但内部不能包含单引号。
双引号表示的字符串里可以包含单引号,但内部不能包含双引号。

格式化输出

牛牛、牛妹和牛可乐正在Nowcoder学习Python语言,现在给定他们三个当中的某一个名字name,
假设输入的name为Niuniu,则输出 I am Niuniu and I am studying Python in Nowcoder!
请按以上句式输出相应的英文句子。

主要是考察format函数的用法:

name = input()
print('I am {} and I am studying Python in Nowcoder!'.format(name))

或用字典的方法,但局限是不能自动追加新人名,需要手动修改字典:

names = {
    "Niuniu": "I am Niuniu and I am studying Python in Nowcoder!",
    "Niumei": "I am Niumei and I am studying Python in Nowcoder!",
    "Niuke": "I am Niuke and I am studying Python in Nowcoder!",
}
name = input()
for i in names:
    if name == i:
        print(names[name])

小数输出

牛牛正在学习Python的输出,他想要使用print函数控制小数的位数,你能帮助它把所有读入的数据都保留两位小数输出吗?

a = input()
print("%.2f"%float(a))

类型转换

input读入一个十六进制数字,按照字符串的形式包括数字0-9、字母A-F,
输出读入数字的十进制大小。

错误示范:

dic = {"A": "10", "B": "11", "C": "12", "D": "13", "E": "14", "F": "15"}
num = input()
if 45 < ord(str(num)) < 58:
    print(num)
else:
    print(dic[num])

虽然能输出0-F的十进制数,但如果输入十六进制的16,应对应为22(1*16+6=22)

参考答案:

num = input()
print(int(num,16))

列表

发送offer

描述 某公司在面试结束后,创建了一个依次包含字符串 ‘Allen’ 和 ‘Tom’ 的列表offer_list,作为通过面试的名单。
请你依次对列表中的名字发送类似 ‘Allen, you have passed our interview and will soon
become a member of our company.’ 的句子。
但由于Tom有了其他的选择,没有确认这个offer,HR选择了正好能够确认这个offer的Andy,所以请把列表offer_list中
‘Tom’ 的名字换成 ‘Andy’ , 再依次发送类似 ‘Andy, welcome to join us!’ 的句子。 输入描述:无
输出描述: 按题目描述进行输出即可。 Allen, you have passed our interview and will soon
become a member of our company. Tom, you have passed our interview and
will soon become a member of our company. Allen, welcome to join us!
Andy, welcome to join us!

参考答案:

offer_list = ['Allen','Tom']
for i in offer_list:
    print(i+', you have passed our interview and will soon become a member of our company.')
offer_list.remove('Tom')
offer_list.append('Andy')
for i in offer_list:
    print(i+', welcome to join us!')

生成数字列表

描述
牛牛在牛客网系统录入了一连串数字,数字之间依靠逗号隔开,你能帮助他将这些数字存储在列表中吗,列表元素以int的形式。
输入描述:
输入一行整数,数字之间以空格间隔。
输出描述:
输出这些数字组成的完整列表。
示例1
输入:
1 2 3 4 5
复制
输出:
[1, 2, 3, 4, 5]

num = input()
list1 = num.split(' ')
ct = 0
for i in list1:
    list1[ct] = int(i)
    ct += 1
print(list1)

删除简历

描述
牛牛在各大互联网公司投入了简历,公司的名字通过字符串的形式在一行中输入,请用列表记录。现在牛牛已经确定了第一所公司的HR表露了不录用他的态度,请你使用del函数帮助牛牛从列表中删除第一个元素,然后输出列表。
输入描述:
以字符串的形式输入公司名字,字符串之间以空格间隔。
输出描述:
输出删除第一个元素后的完整列表。
示例1
输入:
Baidu Meituan Nowcoder Huawei apple
复制
输出:
[‘Meituan’, ‘Nowcoder’, ‘Huawei’, ‘apple’]

names = input()
list1 = names.split()
list1.remove(list1[0])
print(list1)

淘汰排名最后的学生

描述
某实验班实行末位淘汰制,期中考试需要淘汰末三位同学。现输入一行多个字符串表示按分数排名的该班级同学的名字(数量一定不少于三个),请你使用list将其封装为列表,然后使用三次pop函数,去掉末三位同学的名字,最后输出淘汰后的班级名字列表。
输入描述:
输入一行多个字符串表示同学名字,最少不少于3个名字,以空格间隔。
输出描述:
输出删除末三位后的完整列表。
示例1
输入:
NiuNiu Tom Tony Lucy
复制
输出:
[‘NiuNiu’]

names = input()
list1 = names.split()
for i in range(3):  #pop三次
	list1.pop()  #默认弹出(删除)列表最后一个元素
print(list1)

描述
创建一个依次包含字符串’P’、‘y’、‘t’、‘h’、'o’和’n’的列表my_list,先使用sorted函数对列表my_list进行临时排序,第一行输出排序后的完整列表,第二行输出原始的列表。再使用sort函数对列表my_list进行降序排序,第三行输出排序后完整的列表。
输入描述:

输出描述:
第一行输出临时排序后的列表;
第二行输出原始的列表;
第三行输出完成降序排序后的列表。

list1 = ["P", "y", "t", "h", "o", "n"]
print(sorted(list1))
print(list1)
print(sorted(list1,reverse=True))
#或用list1.sort(reverse=True)

密码游戏

描述
牛牛和牛妹一起玩密码游戏,牛牛作为发送方会发送一个4位数的整数给牛妹,牛妹接收后将对密码进行破解。
破解方案如下:每位数字都要加上3再除以9的余数代替该位数字,然后将第1位和第3位数字交换,第2位和第4位数字交换。
请输出牛妹破解后的密码。
输入描述:
输入一个四位数的整数。
输出描述:
输出破解后的密码,以四位数的形式。
示例1
输入:
1234
复制
输出:
6745
复制
备注:
输入不会有前置0,但是输出要保持前置0

num = input()
list1 = [0, 1, 2, 3]
for i in range(0,len(num)):
    list1[i] = str((int(num[i]) + 3)%9)
tmp = list1[0]
list1[0] = list1[2]
list1[2] = tmp
tmp = list1[1]
list1[1] = list1[3]
list1[3] = tmp
num = "".join(list1)
print(num)

运算符

除法与取模运算

描述
我们都知道在计算机里除法有两种,一种是整除,结果有商和余数,另一种则是将其除到有小数。现输入两个数字x与y,分别计算两种除法下x/y的结果。
输入描述:
分两行输入两个整数x与y,其中y不为0.
输出描述:
第一行输出x除以y的商和余数;
第二行输出x除以y的非整除结果,保留两位小数。
示例1
输入:
3
2
复制
输出:
1 1
1.50

x = int(input())
y = int(input())
print(x//y,x%y)
print("%.2f"%float(x/y))

与或非逻辑运算

描述
牛牛想要锻炼自己的逻辑能力,于是输入了两个整型变量x和y,分别判断它们的与、或、非关系,你能帮他输出x与y,x或y,非x,非y的值吗?
输入描述:
输入两个整数x和y,通过空格间隔。
输出描述:
每行分别直接输出x与y,x或y,非x,非y的值,前两个为数值,后两个为布尔值。
示例1
输入:
0 2
复制
输出:
0
2
True
False

参考答案:

x, y = input().split()
print(x and y)
print(x or y)
print(not int(x))
print(not int(y))

俱乐部成员

描述
牛客网内部有一个刷题俱乐部,是大家比拼刷题与交流算法的地方。现在给出俱乐部的名单,请以列表的形式记录它们,并使用Python的成员运算检验给出的名字name是否属于这个俱乐部?(名字区分大小写)
输入描述:
第一行输入俱乐部的名单,以多个字符串的形式,字符串之间用空格间隔;
第二行输入要查询的名字name。
输出描述:
直接输出这个名字是否属于俱乐部名单的布尔值,True或者False。
示例1
输入:
NiuNiu NiuMei NiuNeng Niukele
NiuMei
复制
输出:
True

names = input().split()
name = input()
ct = 0
for i in names:
    if name == i:
        ct += 1
    else:
        ct += 0
if ct==1:
    print('True')
else:
    print('False')

或:

lst=input().split()
name=input()
print(name in lst)

二进制运算

描述
Python有位运算,是直接将数字看成二进制,直接对二进制数字的每一位进行运算。现输入两个十进制整数x、y,请计算它们的位与、位或,输出按照十进制的形式。
输入描述:
一行输入两个整数x、y,以空格间隔。
输出描述:
第一行输出x位与y;
第二行输出x位或y。
示例1
输入:
1 2
复制
输出:
0
3
复制
说明:
1 = 0001,2 = 0010
0001 & 0010 = 0000 = 0
0001 |0010 = 0011 = 3

x,y = input().split()
print(int(x)&int(y))
print(int(x)|int(y))

条件语句

判断列表是否为空

warning 校招时部分企业笔试将禁止编程题跳出页面,为提前适应,练习时请使用在线自测,而非本地IDE。
描述
创建一个空列表my_list,如果列表为空,请使用print()语句一行输出字符串’my_list is empty!‘,
否则使用print()语句一行输出字符串’my_list is not empty!’。
输入描述:

输出描述:
按题目描述进行输出即可。

参考答案:

my_list = []  #若列表不为空的话转至else
if my_list:
    print('my_list is not empty!')
else:
    print('my_list is empty!')

禁止重复注册!

描述
创建一个依次包含字符串’Niuniu’、‘Niumei’、‘GURR’和’LOLO’的列表current_users,
再创建一个依次包含字符串’GurR’、‘Niu Ke Le’、'LoLo’和’Tuo Rui Chi’的列表new_users,
使用for循环遍历new_users,如果遍历到的新用户名在current_users中,
则使用print()语句一行输出类似字符串’The user name GurR has already been registered! Please change it and try again!'的语句,
否则使用print()语句一行输出类似字符串’Congratulations, the user name Niu Ke Le is available!'的语句。(注:用户名的比较不区分大小写)
输入描述:

输出描述:
按题目描述进行输出即可。
The user name GurR has already been registered! Please change it and try again!
Congratulations, the user name Niu Ke Le is available!
The user name LoLo has already been registered! Please change it and try again!
Congratulations, the user name Tuo Rui Chi is available!

前面的题基本上都是白给,这道稍微有点小意思:

current_users = ["Niuniu", "Niumei", "GURR", "LOLO"]
new_users = ["GurR", "Niu Ke Le", "LoLo", "Tuo Rui Chi"]
ct = 0
for i in new_users:
    for j in current_users:
        if i.lower() == j.lower():
            ct += 1
        elif i.lower() != j.lower():
            ct += 0
    if ct == 1:
        print("The user name",i,"has already been registered! Please change it and try again!")
    elif ct == 0:
        print("Congratulations, the user name", i, "is available!")
    ct = 0

菜单字典

描述
牛客食堂今天准备了很多丰盛的午餐, ‘pizza’:10块钱一份,‘rice’ :2块钱一份,‘yogurt’:5块钱一份,剩下的其他菜品都是8块钱一份。牛牛在某窗口点餐,请你根据他输入的字符串,使用if-elif-else语句判断牛牛需要花费多少钱?
输入描述:
输入一个字符串表示菜品。
输出描述:
输出该菜品的价格。
示例1
输入:
pizza
复制
输出:
10

name = input()
menu = {'pizza':10,'rice':2,'yogurt':5}
if name in menu:
    print(menu[name])
else:
    print(8)

面向对象

兔子的数量

描述
兔子的数量以这样的方式增长:每个月的兔子数量等于它前一个月的兔子数量加它前两个月的兔子数量,即f(n)=f(n-1)+f(n-2)。假设第1个月的兔子有2只,第2个月的兔子有3只,你能使用递归的方法求得第n个月的兔子有多少只吗?
输入描述:
输入正整数n,n<10。
输出描述:
输出第n个月的兔子数量。
示例1
输入:
3
复制
输出:
5
复制
说明:
第一个月2只+第二个月3只=第三个月5只

经典的递归例子:

num = int(input())

def fact(x):
    if x==0 or x==1:
        y = 2
    elif x==2:
        y = 3
    else:
        y = fact(x-1) + fact(x-2)
    return y

print(fact(num))

类-修改属性1

描述
请为牛客网的员工创建一个Employee类,包括属性有姓名(name)、(salary),并设置初始化。同时该类包括一个方法printclass,用于输出类似’NiuNiu‘s salary is 4000, and his age is 22’的语句。
请根据输入的name与salary为该类创建实例e,并调用printclass方法输出信息,如果没有年龄信息则输出错误信息"Error! No age"。
根据输入的年龄为实例e直接添加属性age等于输入值,再次调用printclass方法输出信息。(printclass方法中建议使用try…except…结构)
输入描述:
三行分别输入姓名name、工资salary、年龄age,其中第一个为字符串,后两个为整型数字。
输出描述:
根据描述输出错误信息或是打印信息。
示例1
输入:
NiuNiu
8000
22
复制
输出:
Error! No age
NiuNiu’salary is 8000, and his age is 22

class Employee:
    def __init__(self, name, salary):
        self.name = name
        self.salary = salary
    def printclass(self):
        try:
            print(f"{self.name}'salary is {self.salary}, and his age is {self.age}")
        except:
            print('Error! No age')

e = Employee(input(), input())
e.printclass()
e.age = input()
e.printclass()

类-修改属性2

描述
请为牛客网的员工创建一个Employee类,包括属性有姓名(name)、(salary),并设置初始化。同时该类包括一个方法printclass,用于输出类似’NiuNiu‘s salary is 4000, and his age is 22’的语句。
请根据输入的信息为Employee类创建一个实例e,调用hasattr方法检验实例有没有属性age,如果存在属性age直接调用printclass输出,否则使用setattr函数为其添加属性age,并设置值为输入后,再调用printclass输出。
输入描述:
三行分别依次输入姓名name、工资salary、年龄age,其中第一行为字符串,后两行为整型数字。
输出描述:
第一行输出e有没有属性age,True或者False;
第二行输出printclass打印信息。
示例1
输入:
NiuNiu
4000
23
复制
输出:
False
NiuNiu’salary is 4000, and his age is 23

class Employee:
    def __init__(self, name, salary):
        self.name = name
        self.salary = salary

    def printclass(self):
        print(f"{self.name}'salary is {self.salary}, and his age is {self.age}")


e = Employee(input(), input())
if hasattr(e, "age"):
    e.printclass()
if hasattr(e, "age") is False:
    print(hasattr(e, "age"))
    e.age = input()
    e.printclass()

重载

描述
请创建一个Coordinate类表示坐标系,属性有x和y表示横纵坐标,并为其创建初始化方法__init__。
请重载方法__str__为输出坐标’(x, y)'。
请重载方法__add__,更改Coordinate类的相加运算为横坐标与横坐标相加,纵坐标与纵坐标相加,返回结果也是Coordinate类。
现在输入两组横纵坐标x和y,请将其初始化为两个Coordinate类的实例c1和c2,并将坐标相加后输出结果。
输入描述:
第一行输入两个整数x1与y1,以空格间隔。
第二行输入两个整数x2与y2,以空格间隔。
输出描述:
输出相加后的坐标。
示例1
输入:
1 2
3 4
复制
输出:
(4, 6)

class Coordinate:
    def __init__(self,x,y):
        self.x = x
        self.y = y
    def __str__(self):
        print((self.x,self.y))
    def __add__(self):
        self.x = x1 + x2
        self.y = y1 + y2

x1, y1 = map(int, input().split())
x2, y2 = map(int, input().split())
c1 = Coordinate(x1,y1)
c1.__add__()
c1.__str__()

正则表达式re库

正则查找网址

描述
牛牛最近正在研究网址,他发现好像很多网址的开头都是’https://www’,他想知道任意一个网址都是这样开头吗。于是牛牛向你输入一个网址(字符串形式),你能使用正则函数re.match在起始位置帮他匹配一下有多少位是相同的吗?(区分大小写)
输入描述:
输入一行字符串表示网址。
输出描述:
输出网址从开头匹配到第一位不匹配的范围。
示例1
输入:
https://www.Nowcoder.com
复制
输出:
(0, 11)

import re
str = input()
a = re.match('https://www',str,flags=re.I)
print(a.span()) #返回匹配值的下标

提取数字

描述
牛牛翻看以前记录朋友信息的电话薄,电话号码几位数字之间使用-间隔,后面还接了一下不太清楚什么意思的英文字母,你能使用正则匹配re.sub将除了数字以外的其他字符去掉,提取一个全数字电话号码吗?
输入描述:
输入一行字符串,字符包括数字、大小写字母和-
输出描述:
输出该字符串提取后的全数字信息。
示例1
输入:
2022-063-109NiuMei
复制
输出:
2022063109

import re
str1 = input()
str2 = re.sub('\D','',str1)  #'\D'表示非数字字符
print(str2)

常用正则表达式字符:牛客Python在线编程练习笔记_第1张图片

办公掌握下面这些就好了,up后面的举例偏专业,可以跳过哈哈
匹配符:
d? d出现0/1次
a* a可以出现0/多次
a+ a出现一次以上
a{6} a出现6次
a{2,} a出现2次以上
a{2,6} a出现2-6次
匹配多个字符:
(ab)+ ab出现一次以上
或运算:
a (cat|dog) 匹配 a cat or a dog
a cat|dog 匹配 a cat or dog
字符类:
匹配由abc构成的数据【abc】+ abc出现一次以上 abc aabbcc
【a-zA-Z0-9】 ABCabc123
^ 排除 【^0-9】 匹配0-9之外的数据(包括换行符)
元字符
\d 数字字符 \d+ 匹配一个以上的数字
\D 非数字字符
\w 单词字符 单词 数字 下划线即英文字符
\W 非单词字符
\s 空白符 包含空格和换行符
\S 非空白字符
\b 单词的边界 单词的开头或结尾 单词与符号之前的边界
\B 非单词的边界 符号与符号 单词与单词的边界
. 任意字符不包含换行符
. 表示. 通过\进行了转意
^ 匹配行首 $ 匹配行尾
*+{}贪婪匹配
https://www.wondershare. com<>
<.+> 会匹配整串 因为是贪婪匹配
<.+?> 只匹配两个标签代码,? 设置为懒惰匹配

去除注释内容

描述
牛牛记录电话号码时,习惯间隔几位就加一个-间隔,方便记忆,同时他还会在电话后面接多条#引导的注释信息。拨打电话时,-可以被手机正常识别,#引导的注释信息就必须要去掉了,你能使用正则匹配re.match将前面的数字及-信息提取出来吗,去掉后面的注释信息。
输入描述:
输入一行字符串,包括数字、大小写字母、#、-及空格。
输出描述:
输出提取的仅包含数字和-的电话号码。
示例1
输入:
123-3456-789 #NiuMei #1 cool girl
复制
输出:
123-3456-789

import re
str1 = input()
str2 = re.sub("#.*$","",str1)
print(str2)

牛客Python在线编程练习笔记_第2张图片

你可能感兴趣的:(Python,python,开发语言)