难度不大,估计后面面试会狠狠拷打/刷人😓。
T1
给出T(1≤T≤1000)T(1\le T\le 1000)T(1≤T≤1000)个数字,每个数字的范围是[1,101000][1, 10^{1000}][1,101000],请你给出每个数字显示需要的数码管个数
示例
输入
2
173
65
输出
8 leds
11 leds
解答
签到题
convertList = [6, 2, 5, 5, 4, 5, 6, 3, 7, 6]
T = int(input())
for _ in range(T):
ans = 0
line = input()
for num in line:
ans += convertList[int(num)]
print(f'{ans} leds')
T2
给一个字符串,长度为n,进行n次下面的”扩散“操作,请你给出扩散后的结果。
阴阳盘初始状态为阴
操作次数和字符串下标均从1开始,在第 i 次操作中
- 如果iii为奇数,操作下标p=n/2−floor(i/2)p=n/2 - floor(i/2)p=n/2−floor(i/2),floorfloorfloor为下取整
- 如果iii为偶数,操作下标p=n/2+i/2p=n/2 + i/2p=n/2+i/2
根据阴阳盘状态作出如下操作
- 如果阴阳盘状态为阴,并且当前操作位置上的字符为小写字符。将字符转换为大写字符,并转换阴阳盘状态为阳
- 如果阴阳盘状态为阳,并且当前操作位置上的字符为大写字符。将字符转换为小写字符,并转换阴阳盘状态为阴
其余情况不做任何操作。题目保证nnn为偶数且n>0n\gt0n>0。
示例
输入
6
abcDEF
输出
ABCdef
解答
一开始理解错了题意,以为只需要把前半段转换成大写,后半段转换成小写,忽略了“其余情况不做任何操作”。
按照题目来操作即可。
from math import floor
n = int(input())
instr = input()
flag = False #阴阳盘为阴
ans_temp = None
ans_ji = []
ans_ou = []
for i in range(1, n+1):
if i&1: #奇数位置
p = n/2 - floor(i/2)
else:
p = n/2 + i/2
p = int(p)
if not flag: #阴阳盘为阴,变小写为大写
if ord(instr[p-1])>=97:
ans_temp = chr(ord(instr[p-1])-32)
flag = True
else:
ans_temp = instr[p-1]
else: #阴阳盘为阳
if ord(instr[p-1])<97:
ans_temp = chr(ord(instr[p-1])+32)
flag = False
else:
ans_temp = instr[p-1]
if i&1:
ans_ji.append(ans_temp)
else:
ans_ou.append(ans_temp)
ans_ji.reverse()
ans_temp = ans_ji + ans_ou
print("".join(ans_temp))
T3
小明在数轴上放置了一个机器人,当提供L指令时机器人会向左移动一格,当提供R指令时机器人会向右移动一格。数轴上的位置iii处放置了∣i∣|i|∣i∣个糖果,当机器人首次到达一个位置时会得到对应数量的糖果。小明提供一个长度为n的操作序列,并重复执行k次,请你计算出机器人能够得到的糖果总数
示例
输入
3 2
RRR
输出
21
输入
5 5
RRLLR
输出
21
解答
一开始想错了,直接把区间端点∗*∗k,实际上应该是结束点∗*∗k+(端点-结束点)才是覆盖的范围。然后就是等差数列求和。
line = input().split(' ')
n = int(line[0])
k = int(line[1])
command = input()
now = 0
left = 0
right = 0
ans = 0
for i in range(n):
if command[i] == 'L':
now -= 1
else:
now += 1
left = min(left, now)
right = max(right, now)
#now *= k
if now < 0:
left = now*k + (left - now)
elif now > 0:
right = now*k + (right - now)
left = -left
ans = left*(left+1)/2 + right*(right+1)/2
ans = int(ans)
print(ans)
2万+

被折叠的 条评论
为什么被折叠?



