研发工程师L2_编程题
研发工程师L2_编程题
1、【模板】栈
题目描述:
请你实现一个栈。
操作:
push x:将 加x 入栈,保证 x为 int 型整数。
pop:输出栈顶,并让栈顶出栈
top:输出栈顶,栈顶不出栈
输入描述:
第一行为一个正整数 n ,代表操作次数。(1≤n≤100000)
接下来的 n,每行为一个字符串,代表一个操作。保证操作是题目描述中三种中的一种。
输出描述:
如果操作为push,则不输出任何东西。
如果为另外两种,若栈为空,则输出 "error“
否则按对应操作输出。
示例1
输入 | 6 push 1 pop top push 2 push 3 pop |
输出 | 1 error 3 |
class Stack:
def __init__(self):
self.items = []
def isEmpty(self):
return self.items == []
def push(self, item):
self.items.append(item)
def pop(self):
return self.items.pop()
def peek(self):
return self.items[len(self.items) - 1]
def size(self):
return self.items[len(self.items)]
s = Stack()
num = int(input())
for i in range(num):
a = input()
if a[0:4] == "push":
b = a.split(" ")
s.push(int(b[1]))
if a == "pop":
if s.isEmpty() == True:
print("error")
else:
print(s.peek())
s.pop()
if a == "top":
if s.isEmpty() == True:
print("error")
else:
print(s.peek())
2、小红取数
题目描述:
小红拿到了一个数组,她想取一些数使得取的数之和尽可能大,但要求这个和必须是 k 的倍数。你能帮帮她吗?
输入描述:
输出描述:
如果没有合法方案,输出 -1。
否则输出最大的和。
示例1
输入 | 5 5 4 8 2 9 1 |
输出 | 20 |
说明:取后四个数即可
n, k = map(int, input().split())
arr = list(map(int, input().split()))
map1 = [[] for _ in range(k)]
dp = [[0] * k for _ in range(n + 1)]
maxi = 0
for i in range(1, n + 1):
for j in range(k):
dp[i][j] = max(dp[i - 1][j], dp[i][j])
dp[i][(dp[i - 1][j] + arr[i - 1]) % k] = max(
dp[i - 1][j] + arr[i - 1], dp[i][(dp[i - 1][j] + arr[i - 1]) % k]
)
if dp[-1][0]:
print(dp[-1][0])
else:
print(-1)
3、串
题目描述:
长度不超过nn,且包含子序列“us”的、只由小写字母构成的字符串有多少个? 答案对取模。所谓子序列,指一个字符串删除部分字符(也可以不删)得到的字符串。例如,"unoacscc"包含子序列"us",但"scscucu"则不包含子序列"us"
输入描述:
一个正整数n
输出描述:
一个正整数,为满足条件的字符串数量对取模的值
![]() | |
n = int(input())
def dfs(n):
if n == 2:return 1
dp = [25,1,0]
result = 0
mod = 10**9+7
for i in range(2,n+1):
dp[2] = (dp[1]+dp[2]*26)%mod
dp[1] = (dp[0]+dp[1]*25)%mod
dp[0] = (dp[0]*25)%mod
result += dp[2]
return result%mod
print(dfs(n))
4、经此一役小红所向无敌
题目描述:
经过重重困难,对立和光终于来到魔王城,和最终的大魔王——小红进行决战。
已知小红的血量是 。
对立的攻击力是 a ,血量是 h 。
光的攻击力是 b,血量是 k 。
每回合光先对小红发起攻击,然后对立对小红发起攻击,然后小红展开幻术,令光和对立同时互相攻击。
每次攻击后,受击者的血量会减掉攻击者的攻击力。
当光和对立其中一人死亡后,另一人会悲痛欲绝,对小红发出自己攻击力*10的伤害的大招,然后自杀。(若两人同时死亡,则两人都无法发出大招)
小红想知道,弱小的光和对立,她们能对自己造成多少点伤害?
说明:
第一回合,小红受到了对立和光的攻击,并让她们互相攻击。第一回合结束时,小红共受到 3 点伤害。这时对立血量为 2 ,光的血量为 1 。
第二回合,小红受到了对立和光的攻击,并让她们互相攻击。这时对立血量为 1 ,光的血量为 0 死亡。对立放出大招后自杀。本回合小红共受到 23 点伤害。
小红受到的总伤害为 3+23=263+23=263+23=26 。
import math
a,h,b,k = map(int,input().split())
t1 = math.ceil(h/b)
t2 = math.ceil(k/a)
if t1==t2:
out = t1*(a+b)
elif t1<t2:
out = t1*(a+b)+b*10
else:
out = t2*(a+b)+a*10
print(out)
5、加减
题目描述:
小红拿到了一个长度为 n 的数组。她每次操作可以让某个数加 1 或者某个数减 1 。
小红最多能进行 k 次操作。她希望操作结束后,该数组出现次数最多的元素次数尽可能多。
你能求出这个最大的次数吗?
n,k=map(int,input().split())
arr = list(map(int,input().split()))
arr.sort()
arr1 = [0 for i in range(n+1)]
for i in range(1,n+1):
arr1[i]=arr1[i-1]+arr[i-1]
p1=0
p2=0
maxlen=1
while(p2<n):
p=(p2+p1)//2
step= arr[p]*(p-p1+1)-(arr1[p+1]-arr1[p1]) +arr1[p2+1]-arr1[p+1]-arr[p]*(p2-p)
if(step<=k):
maxlen=max(maxlen,p2+1-p1)
p2=p2+1
elif p1<p2:
p1=p1+1
print(maxlen)
6、kotori和糖果
题目描述:
kotori共有n块糖果,每块糖果的初始状态是分散的,她想把这些糖果聚在一堆。但她每次只能把两堆糖果合并成一堆。已知把两堆数量为a和b的糖果聚在一堆的代价是|a-b|。kotori想知道,她把这n块糖果聚在一堆的最小代价是多少?
输入描述:
第一行是一个正整数T,代表数据组数。第二行到第T+1行,每行一个非负整数n,代表kotori的糖果总数量。
输出描述:
每行一个整数,代表kotori需要花费的最小代价。
示例:
备注:对于50%的数据,0<T≤100000, 0≤n≤100000 对于另外50%的数据,T=1 , 0≤n≤1e18
T=int(input())
m={}
def s(n):
if n <3:
return 0
if n in m:
return m[n]
else:
c=s(n//2)+s(n-n//2)+n%2
m[n]=c
return c
for i in range(T):
print(s(int(input())))
7、kotori和迷宫
题目描述:
kotori在一个n*m迷宫里,迷宫的最外层被岩浆淹没,无法涉足,迷宫内有k个出口。kotori只能上下左右四个方向移动。她想知道有多少出口是她能到达的,最近的出口离她有多远?
输入描述:
第一行为两个整数n和m,代表迷宫的行和列数 (1≤n,m≤30);后面紧跟着n行长度为m的字符串来描述迷宫。'k'代表kotori开始的位置,'.'代表道路,'*'代表墙壁,'e'代表出口。保证输入合法。
输出描述:
若有出口可以抵达,则输出2个整数,第一个代表kotori可选择的出口的数量,第二个代表kotori到最近的出口的步数。(注意,kotori到达出口一定会离开迷宫)若没有出口可以抵达,则输出-1。
n,m=map(int,input().split())
ls=[]
for i in range(n):
ls.append(list(input()))
def maze(ls,si,sj,dt):
ec=0
lc=0
ml=200
q=list()
q.append((si,sj,lc))
while q:
h,c,lc=q.pop()
lc+=1
for a,b in [(h-1,c),(h+1,c),(h,c-1),(h,c+1)]:
if 0<=a<n and 0<=b<m:
if ls[a][b]=='.':
ls[a][b]='f'
q.append((a,b,lc))
if ls[a][b]==dt:
ec+=1
ml=min(lc,ml)
ls[a][b]='f'
if ec==0:
print(-1)
else:
print(ec,ml)
for i in range(n):
for j in range(m):
if ls[i][j]=='k':
maze(ls,i,j,'e')
---------------------------------欢迎提供L2题目,持续更新-------------------------------------
更多推荐
所有评论(0)