[学习编程]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次,但我们的输出列表只会包含23一次。

即:[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_weekendTrue时,则没有上限的雪茄数量。
给定抽雪茄的数量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. 创建并打印链表 开始的题目都是链表的练习题。

posted @ 2023-10-20 09:05  viphhs  阅读(132)  评论(0编辑  收藏  举报