思路:使用两个滑窗记录当前歌词列表和选择的歌词,根据字符串中操作指令模拟即可
代码:
#感觉很简单,就是两个滑窗,一个长度为4,一个长度为1 #注意,大滑窗带一个光标,要与小滑窗区别开 #当然,要对歌曲总数做分类讨论 n=int(input()) s=list(input()) ans=0#存储最后选中的歌曲,即小滑窗,这里从0开始计数,方便后面做模运算 lst=[i for i in range(1,4)]#存储屏幕显示的歌曲,即大滑窗,n小于4时这里初始化会有问题,在下面的if中纠正 flag=1#存储大滑窗中光标选中的歌曲下标 #歌曲总数比屏幕小,只需要处理小滑窗 if n<=4: #处理小滑窗 for i in s: if i=="U": ans=(ans-1+n)%n elif i=="D": ans=(ans+1)%n #处理大滑窗 lst=[i for i in range(1,n+1)] #歌曲总数比屏幕大,大小滑窗都要处理。 else: #处理小滑窗、大滑窗 for i in s: if i=="U": if flag==1:#光标在第一个,大滑窗需要更新 if ans==0:#并且是第一首歌 flag=4 #更新大滑窗 lst=[i for i in range(n-3,n+1)] else: flag=1 #更新大滑窗 lst=[i-1 for i in lst]#每个元素都减1 else: flag-=1#光标在2、3、4,直接光标上移即可 ans=(ans-1+n)%n#处理小滑窗 elif i=="D": if flag==4:#光标在最后一个,大滑窗需要更新 if ans==n-1:#当前为最后一首歌 flag=1 lst=[i for i in range(1,5)] else: flag=4 lst=[i+1 for i in lst] else: flag+=1 ans=(ans+1)%n#处理小滑窗 #输出结果 for i in lst: print(i,end=" ") print() print(ans+1)