第一种方法似乎比第二种简单,第一种方法只生成必要的列表,第二种却老实巴交一开始就生成了完整歌曲列表

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