[学习编程]pythontip题库题目心得及讲解
最近又强化了一波python,把一些心得记录下来,备忘。
可以练习python的网站
扫描二维码可以了解更多Python课程。
题目1 最小缺失数
编写一个Python程序,找出列表中最小的缺失整数(理想情况下为连续数字)。 输入的列表保证只有一个缺失数字,而且列表中的数字都是正整数,列表中的数字不会重复,且最小数字为起始数字。 比如是[2,3,4]
的话,缺失值是5
,而不是1
,而[2,4]
缺失数字为3
。
# 用你的代码替换 ___ # 定义一个函数,找出列表中使序列连续的最小缺失数 def find_smallest_missing(lst): # 首先对列表进行排序 lst.sort() # 使用enumerate遍历列表,这样我们可以得到索引和元素 for i, element in enumerate(lst): # 如果当前元素加1等于下一个元素,继续循环,因为序列是连续的 if i+1< len(lst) and element+1==lst[i+1]: continue # 但如果不是, # 返回当前元素加1后的值 else: return element+1 # 调用函数 numbers = eval(input()) missing_number = find_smallest_missing(numbers) print(missing_number)
心得:
1、enumerate可以同时获得元素和序号。
2、要避免下标越界。
题目2 嵌套元组唯一元素
编写一个程序来提取嵌套元组中的唯一元素。
例如,在嵌套元组((1,2,3),(2,4,6),(2,3,5))
中,2重复出现了3次,3重复出现了2次,但我们的输出列表只会包含2、3一次。
即:[1, 2, 3, 4, 5, 6]
- 定义函数
get_unique_elements()
,函数接受一个参数 - 一个包含三个元组的嵌套元组。 - 在函数内,提取所有元组中的独立元素,确保不重复提取元素。
- 以列表的形式返回唯一的元素,并从小到大排序。
def get_unique_elements(nested_tuples): # 此处编写代码 lst=[] for i in range(len(nested_tuples)): for j in range(len(nested_tuples[0])): lst.append(nested_tuples[i][j]) a=list(set(lst)) a.sort() return a # 初始化嵌套元组 nested_tuples = [] # 获取用户输入 for _ in range(3): tuple_elements = tuple(map(int, input().split())) nested_tuples.append(tuple_elements) # 调用函数 print(get_unique_elements(nested_tuples))
心得:
1、两次循环将嵌套元组转为列表。
2、将列表转为集合,就可以去重。
3、sort()方法并不返回内容,直接将原列表排序。sorted则不同,返回排序的内容。
sort()与sorted()的不同在于,sort是在原位重新排列列表,而sorted()是产生一个新的列表。
sort 是应用在 list 上的方法,sorted 可以对所有可迭代的对象进行排序操作。
sort 只是应用在 list 上的方法(就地排序无返回值)。
sorted 是内建函数,可对所有可迭代的对象进行排序操作,(返回新的list)。
list 的 sort 方法返回的是对已经存在的列表进行操作,而内建函数 sorted 方法返回的是一个新的 list,而不是在原来的基础上进行的操作。
题目3 雪茄派对
https://www.runoob.com/python/python-func-any.html
松鼠有个癖好开派对时,它们喜欢抽雪茄。当抽雪茄的数量在40到60之间时(抽多了要晕,包括40 和 60),则松鼠派对是成功的。
但如果是周末is_weekend
为True
时,则没有上限的雪茄数量。
给定抽雪茄的数量cigars
和 是否为周末is_weekend
请判断当前派对是否成功,成功返回True
失败返回False
。
def cigar_party(cigars, is_weekend): return (cigars>=40) and (cigars <=60 or is_weekend) #输入数据 cigars, is_weekend = eval(input()) #调用函数打印结果 print(cigar_party(cigars, is_weekend))
心得:
要注意观察题目条件,is_weekend 为True时,没有上限。并不意味者下限也没有。
题目4 呼叫排队处理(课程里面的题)
你正在编写一个呼叫中心应用程序,它在一个队列中排队处理客户。
CallCenter类被实现为一个队列Queue 。队列中的每个元素表示呼叫的类型。两个可能的值是"general"和 "technical" 。:
- 普通"general"电话平均需要5分钟来处理,
- 技术"technical"电话需要10分钟。
给出的代码根据用户的输入将多个呼叫类型添加到队列中。 你需要对所有添加的客户呼叫进行排队处理,计算并输出处理所有电话所需的总时间。
class CallCenter: def __init__(self): self.customers = [] def is_empty(self): return self.customers == [] def add(self, x): self.customers.insert(0, x) def next(self): return self.customers.pop() c = CallCenter() while True: n = input() if n == 'end': break c.add(n) #此处编写代码 total=0 while not c.is_empty(): if c.next()=="general": total+=5 else: total+=10 print(total)
心得:
end并未被记录到队列里面去。
题目 5 多项式匹配
eval()
在 Python 中, eval()
函数的功能:将字符串str当成有效的表达式来求值并返回计算结果。
任务
给定一个多项式 P,只有一个不确定的(或变量)x。你也会得到 x和 k 的值。
你的任务是验证 P(x)=k。
输入格式
第一行包含空格分隔的值x 和 k。
第二行包含多项式 P。
限制条件
多项式p的所有系数都是整数。
x和k也是整数。
输出格式
如果满足条件即P(x)=k,则打印 True 。否则,打印 False 。
#在此处编写你的代码。 x,k=list(input().split()) k=int(k) formula=input() if eval(formula)==k: print("True") else: print("False")
心得
刚开始上面的代码总是报错。
输入为
1 4
x**3 + x**2 + x + 1
报错为TypeError: unsupported operand type(s) for ** or pow(): 'str' and 'int'
后来加了一句在x,k=list(input().split())后面
x=int(x)
题目6 任意或全部 any or all
任务
给你一个由空格分隔的整数列表。如果所有的整数都是正数,那么你需要检查是否有任何整数是回文整数
输入格式
第一行包含一个整数N。N 是列表中整数的总数。
第二行包含 N 个空格分隔的整数。
限制条件
0<N<100
输出格式
如果满足问题陈述的所有条件,则打印 True 。否则,打印 False 。
解法
#在此处编写你的代码。 n=int(input()) mylist=list(map(int,input().split())) print(all(int(i)>0 for i in mylist) and any(str(i)==str(i)[::-1] for i in mylist))
心得
1、map() 函数语法:
map(function, iterable, ...)
2、列表推导式
生成10以内的偶数
[x for x in range(10) if x%2==0]
本题中生成all需要用的循环元素,用到了类似的方法
https://blog.csdn.net/weixin_41326473/article/details/118939833
3、any和all函数
any表示任意个条件为真即可。
all表示全部条件为真才可。
https://edu.py2fun.com/articles/39
题目7 python递归算法小课
题目,求1/1+2/(1+2)+3/(1+2+3)+...+n/(1+2+3+...+n)的结果
思路:
刚开始想了几天,也没有结果。后来看递归算法小课的课程,有二进制的递归算法,参考该思路,写出了如下代码:
def cal_sum(n,result): if n==1:#终止条件 return result total=0 for i in range(n+1): total=total+i result=result+n/total return cal_sum(n-1,result) print(cal_sum(2,1))
题目8 连续质数和
编写一个程序,找出一个小于指定数的质数,且该质数可以表示为最多连续质数的和。
- 定义函数
find_consecutive_prime_sum()
,它接受一个整数limit
作为参数。 - 函数应返回小于
limit
的质数,该质数是最多连续质数的和。
心得:下面是我自己写的程序,100的还行,如果算到100000就超时了。先记录在这里,以后改进。
# 检查一个数是否为质数的函数 def is_prime(n): if n < 2: return False for i in range(2, int(n**0.5) + 1): if n % i == 0: return False return True def find_consecutive_prime_sum(limit): # 在这里编写你的代码 consec_prime=[] for i in range(limit+1): if is_prime(i): consec_prime.append(i) result={} for j in range(len(consec_prime)): for i in range(len(consec_prime)): if(i+j)<=len(consec_prime): if (sum(consec_prime[i:i+j]))<limit and is_prime(sum(consec_prime[i:i+j])): result[j]=sum(consec_prime[i:i+j]) a=max(result.keys()) return result[a] # 获取用户输入 limit = int(input()) # 调用函数 print(find_consecutive_prime_sum(limit))
写了一早上,手写了下标,才整明白一点点。
lst=[2,3,5,7,11,13,17,19] def isprime(n): if n<2: return True for i in range(2,n): if n%i==0: return False return True for i in range(len(lst)): for j in range(i+1,len(lst)+1): print(j-i-1,j,i+1) # i+1是length,也就是j-(j-i-1) #if(isprime(sum(lst[j-i-1:j]))): # print(sum(lst[j-i-1:j]))
以100以内的质数为例,尝试测试一下:
lst=[2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,73,79,83,89,97] def isprime(n): if n<2: return True for i in range(2,n): if n%i==0: return False return True length0=0 for i in range(len(lst)): for j in range(i+1,len(lst)+1): if sum(lst[j-i-1:j])<100 and isprime(sum(lst[j-i-1:j])): length=i+1 if length>length0: length0=length result=(sum(lst[j-i-1:j])) print(result)
题目9 求和
2/1+3/2+5/3+8/5+......求前20项的和
方法1 可以使用斐波那契数列尝试。
def fibonacci(n): if n==0: return 0 if n==1: return 1 return fibonacci(n-1)+fibonacci(n-2) result=0 for i in range(2,22): result=fibonacci(i+1)/fibonacci(i)+result print(result)
方法2
num = 1 dom = 1 i=0 lst =[] while i < 20: lst.append(1 + num/dom) num, dom = dom, num + dom i+=1 print(sum(lst))
题目10 正则相关知识备忘
1、re.match 和re.search的区别
https://www.runoob.com/python/python-reg-expressions.html
re.match 从头匹配一个符合规则的字符串,从起始位置开始匹配,匹配成功返回一个对象,未匹配成功返回None
re.search函数会在字符串内查找模式匹配,只要找到第一个匹配然后返回,如果字符串没有匹配,则返回None。
match() 方法一旦匹配成功,就是一个match object对象,而match object对象有以下方法:
- group() 返回被 RE 匹配的字符串
- start() 返回匹配开始的位置
- end() 返回匹配结束的位置
- span()返回一个元组包含匹配 (开始,结束) 的位置
2、https://regexlearn.com/zh-cn/learn/regex101 基本语法学习,很棒的一个网站。自带练习
3、正则中各类基本符号的记忆:* +?的记忆
零星:星号是从0开始的
一加手机:加号是从1开始的
有还是没有这是个问题:?表示的是0或者1,有还是没有
4、^否定符号,需要用在需要否定的字符集前面。+*?需要用在需要定义数量的字符集后面。
b[^ou]r表示不是bor,不是bur 我们也能写作b[^o|u|x]r但是有些累赘。
题目11 数据结构之链表
class Node: def __init__(self, data): self.data = data self.next = None class LinkedList: def __init__(self): self.head = None def print_list(self): cur_node = self.head while cur_node: print(cur_node.data,end="-->") #end更改后,可以使用一个向右的链条来模拟链表的样子 cur_node = cur_node.next print("None") def append(self, data): new_node = Node(data) if self.head is None: self.head = new_node return last_node = self.head while last_node.next: last_node = last_node.next last_node.next = new_node def prepend(self, data): new_node = Node(data) new_node.next = self.head self.head = new_node def insert_after_node(self, prevnodedata, data): new_node = Node(data) # 创建新节点 prev_node=self.head while prev_node.data != prevnodedata and prev_node.next is not None: # 改写了课程里面的内容,依据节点值来插入;课程题目里有一道,是依据节点位置来插入。 prev_node = prev_node.next if prev_node.data!= prevnodedata: print("Prev node not exist, please try another previous Node") else: old=prev_node.next prev_node.next = new_node new_node.next=old llist = LinkedList() llist.append("A") llist.append("B") llist.append("C") llist.insert_after_node("A", "D") llist.print_list()
pythontip的题库中,目前从题目568. 创建并打印链表 开始的题目都是链表的练习题。