第一种方法似乎比第二种简单,第一种方法只生成必要的列表,第二种却老实巴交一开始就生成了完整歌曲列表
while True:
try:
# 获取歌曲数量
n1 = int(input())
# 获取指令
cmds = input()
# 构建字典
dic = {'D': +1, 'U': -1}
# 设置计数器,用于记录光标的位置
num = 1
# 定义空数组用于存储输出列表
res = []
if n1 <= 4: #小于等于4首最简单,直接输出
res = [n for n in range(1, n1 + 1)] # 生成歌曲列表1234
for cmd in cmds:
num = num + dic[cmd]
if num == 0:
num = n1
elif num == n1 + 1:
num = 1
if n1 > 4:
# 记录当前窗口的头尾值
first = 1
end = 4
for cmd in cmds:
num = num + dic[cmd]
if num == 0: # 往上越界
num = n1 # 穿越上边界则到达下边界
first = n1 - 3 # 切换窗口列表的起始和结束
end = n1
elif num == n1 + 1: # 往下越界
num = 1 # 越过下边界则到达上边界
first = 1 # 切换显示窗口
end = 4
# 以上是边界特殊情况,以下是常规
elif num == first - 1: # 平滑上滚
first = first - 1
end = end - 1
elif num == end + 1: # num==5,则平滑下滚
end = end + 1 # 平滑下滚
first = first + 1
elif first <= num <= end: # 该句为防意外,可删除
continue
res = [k for k in range(first, end + 1)] # 形成窗口的列表
# 输出结果
print(' '.join(str(ans) for ans in res))
print(num)
except:
break
第二种:
while True:
try:
n = int(input())
actions = input()
act_dict = {'U':-1,'D':1} #字典操作加减
songs = [str(x) for x in range(1,n+1)] #一开始就生成完整的歌曲列表
start = 0 #歌曲列表中第1个歌曲切片位置
end = 4 #歌曲列表中第4个歌曲切片位置(不含)
ptrGlobal = 1 #光标在歌曲列表中序号(全局指针)
ptrLocal = 1 #光标在当前屏幕上序号(局部指针)
if n <= 4: #不大于4首最简单,只考虑一个序号就够了
for i in actions:
ptrGlobal += act_dict[i]
if ptrGlobal < 1:
ptrGlobal = n
if ptrGlobal > n:
ptrGlobal = 1
else:
print(' '.join(songs))
print(ptrGlobal)
else: #大于4首稍复杂,要考虑两个序号
for i in actions:
ptrGlobal += act_dict[i]
ptrLocal += act_dict[i]
if ptrLocal > 4:
ptrLocal = 4 #将光标在当前屏幕上序号限定在4以内
start += act_dict[i] #小屏幕的起始光标序号要变化
end += act_dict[i]
if ptrGlobal == n+1: #超出边界要回归
ptrGlobal = 1
ptrLocal =1
start = 0
end = 4
if ptrLocal < 1:
ptrLocal = 1
start += act_dict[i]
end += act_dict[i]
if ptrGlobal == 0: #超出边界要回归
ptrGlobal = n
ptrLocal = 4
start = n-4
end = n
else:
face = songs[start:end]#小屏幕歌曲范围
print(' '.join(face))
print(ptrGlobal) #打印全局指针
except:
break