获得用户输入的一个整数N,输出N中所出现不同数字的和。
s = list(set(list(input())))# ①
result = 0
for i in s:
result += eval(i)
print(result)
① set() 函数创建一个无序不重复元素的集合,可进行关系测试,删除重复数据,还可以计算交集、差集、并集等,返回新的集合对象
{ , }
人名最多数统计
编程模板中给出了一个字符串,其中包含了含有重复的人名,请直接输出出现最多的人名。
s = '...字符串...'
from collections import Counter# ①
words = s.split()
c = Counter(words)# ②
print(c.most_common(1)[0][0])# ③
①Counter是一个简单的计数器;
②C 输出的字典类型:{'字符':次数,...}
③most_common(n)
返回一个出现次数从大到小的前 n 个元素的列表。此处是[(字符, 次数)]
方法二:
words = s.split()
counts = {}
for word in words:
counts[word] = counts.get(word, 0) + 1 # ①
items = list(counts.items()) # ②
items.sort(key=lambda x: x[1], reverse=True)
print(items[0][0])
① 字典取值方式
dictname.get(key, value)
;如果key存在返回对应的value,如果key不存在,返回None,设置的不加入字典中
②dictname.items()
函数以列表返回可遍历的(键值)元组数组。
给运动员打分计算总成绩排名
在文件dafen.txt中存放了12个裁判员为10名运动员的评分,现在要求编写程序,从文件中取出这些分数,每个运动员评分中去掉一个最高分和一个最低分,计算平均成绩,然后给出运动员排名;
要求输出格式: print( “第{:2d}名 {:2d}号运动员,平均分为{:6.2f}”.format(名次,运动员编号,平均分))
例如; 第 1名 7号运动员,平均分为 8.56 …(略)
def read_data():#读文件内容,返回读入的数据
fp=open("src/dafen.txt") #以默认的方式打开文件,默认‘r’,'utf-8'
score = []
No = 0
for line in fp:
No+=1
x = list(map(eval, line.split())) #eval函数 接收运行一个字符串表达式,返回表达式的结果值。
a,*s,b = sorted(x)
score.append((sum(s)/10,No))
return score
def cal_sort_avg(p):#对运动员成绩排序,返回排序后的结果
# -------------------BEGIN------------------------
p.sort(key = lambda x: (-x[0],x[1]))
return p
# ------------------END------------------------
def print_result(p):#输出排序结果,按格式输出最终结果
# -------------------BEGIN------------------------
for i in range(len(p)):
print( "第{:2d}名 {:2d}号运动员,平均分为{:6.2f}".format(i+1,p[i][1],p[i][0]))
# ------------------END------------------------
def main():
l1=read_data() #读文件中的数据
l2=cal_sort_avg(l1) #进行数据处理
print_result(l2) #输出结果
if __name__ == '__main__':
main()
判断字符串是否数字
str.isnumeric()
方法可以判断字符串str是否都是数字字符。若都是数字字符,返回true,否则返回false
获取字符在字符串的位置
使用
str.find(c)
方法可以返回字符串str中字符c所在位置的序号。
“2021/2/25“.find(“/“)
返回数字4。
str.rfind(c)
方法可以返回从尾部起,字符串str中字符c所在位置的序号。
“2021/2/25“.rfind(“/“)
返回数字6。
Q4 图论问题
eg:如下图所示,G是一个无向图,其中蓝色边的长度是 11、橘色边的长度是 22、绿色边的长度是 33。则从 A 到 S 的最短距离是多少?
# 录入路线图
lyh_list = [
["A", "E", 1],["A", "B", 2],["A", "C", 1],["A", "D", 1],["A", "E", 1],["B", "G", 1],
["B", "J", 2],["C", "D", 3],["C", "G", 3],["C", "F", 3],["D", "G", 2],["D", "H", 1],
["D", "I", 2],["E", "H", 1],["E", "I", 3],["F", "J", 1],["F", "G", 1],["G", "K", 2],
["G", "I", 3],["H", "L", 2],["H", "I", 1],["I", "M", 3],["J", "S", 2],["K", "N", 1],
["K", "L", 3],["L", "R", 1],["L", "M", 1],["M", "N", 2], ["M", "Q", 1],["M", "S", 1],
["N", "P", 1],["Q", "O", 1],["O", "R", 3],["P", "O", 1],["R", "S", 1],
]
#路线存储器
loads = []
#寻路函数
def find(length, r):# length: 路线长度 r:节点node
for x, y in enumerate(lyh_list):
if r[1] == y[0]:
length+=r[2]
if y[1] == 'S':
loads.append(length)
else: find(length = length, r = y)
for i, j in enumerate(lyh_list):
if j[0] == 'A':
find(length = j[2], r = j)
print(min(loads))
Q5 数字三角形
h = int(input())
list = [list(map(int, input().split())) for i in range(h)]
for i in range(1,h): #从第二行开始
for j in range(0,i+1):
if j == 0:# 最左侧的只能是上一行最左侧的移下来的
list[i][j] += list[i-1][j]
elif j == i:# 最右侧的只能是上一行最右侧的移下来的
list[i][j] += list[i-1][j-1]
else:
list[i][j] += max(list[i-1][j-1:j+1])
# print(max(list[-1]))
if h & 1: # 如果是奇数行,则返回最中间值
print(list[-1][h // 2])
else: # 偶数行则返回中间较大值
print(max(list[-1][h // 2 - 1], list[-1][h // 2]))
一定得看题,不能上来就递归或者搜索
最后一句话决定了题目性质:
①向左下走的次数与向右走的次数相差不能超过1意味着:
|freq(左) - freq(右)| = 0 or 1
② 我们把一次左移和一次右移
称为对称位移
,一次对称位移后,竖直方向是不变的;
③ freq(左)+freq(右) = 行数
,由于①的限制,如果行数是偶数,只能是freq(左) = freq(右)
;如果行数是奇数,只能是|freq(左) - freq(右)| = 1
;
综上,所谓的最大值并不是在一堆数中选最大,实际上最大值是确定值,所以极具误导性
集合的使用
问题描述:
小蓝有 n 个单词,但是单词中有一些是重复的,请帮小蓝去除重复的单词。
输入格式
输入第一行包含一个正整数 n ,表示小蓝的单词数量。
接下来 n 行,每行包含一个由小写字母组成的单词。
输出格式
请输出去除重复后的那些单词。如果一个单词出现了多遍,请保留第一次出现的单词,去除之后出现的单词,按输入的顺序输出。
评测用例规模与约定: 对于所有评测用例,1 <= n <= 100,每个单词的长度不超过 100。
s = input()
s_ = s[::-1]
def check(s):#判断是否为回文
return s == s[::-1]
if check(s): print(s)
else:
for i in range(1, len(s)):
if check(s[i:]):
print(s+s_[-i:])
break
一个m行n列的方格图。开始时,在方格图的左上角,即第1行第1列。可以在方格图上跳跃,跳跃时,如果当前在第r行第c列,不能跳到行号比 r小的行,也不能跳到列号比c小的列。同时,一跳的直线距离不超过 3(不能斜走)。最终要跳到第m行第n列。图中每个格子有权值。从第1行第1列跳到第m行第n列后,总的权值和最大是多少?
m, n = map(int, input().split())
lst = [[map(int, input().split())] for _ in range(m)]
direct = [(0,1),(0,2),(0,3),
(1,0),(1,1),(1,2),
(2,0),(2,1),(3,0)]
for x in range(m):
for y in range(n):
res = []
for dx, dy in direct:
lx = x - dx
ly = y - dy
if (lx >= 0 and ly >= 0 and lx < n and ly < m)
res.append(dp[lx][ly])
dp[x][y] += max(res) if len(res)!=0 else 0
print(dp[-1][-1])