首页 > 试题广场 >

MP3光标位置

[编程题]MP3光标位置
  • 热度指数:132849 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32M,其他语言64M
  • 算法知识视频讲解

MP3 Player因为屏幕较小,显示歌曲列表的时候每屏只能显示几首歌曲,用户要通过上下键才能浏览所有的歌曲。为了简化处理,假设每屏只能显示4首歌曲,光标初始的位置为第1首歌。

现在要实现通过上下键控制光标移动来浏览歌曲列表,控制逻辑如下:

  1. 歌曲总数<=4的时候,不需要翻页,只是挪动光标位置。

光标在第一首歌曲上时,按Up键光标挪到最后一首歌曲;光标在最后一首歌曲时,按Down键光标挪到第一首歌曲。

其他情况下用户按Up键,光标挪到上一首歌曲;用户按Down键,光标挪到下一首歌曲。

2. 歌曲总数大于4的时候(以一共有10首歌为例):


特殊翻页:屏幕显示的是第一页(即显示第1 4首)时,光标在第一首歌曲上,用户按Up键后,屏幕要显示最后一页(即显示第7-10首歌),同时光标放到最后一首歌上。同样的,屏幕显示最后一页时,光标在最后一首歌曲上,用户按Down键,屏幕要显示第一页,光标挪到第一首歌上。

一般翻页:屏幕显示的不是第一页时,光标在当前屏幕显示的第一首歌曲时,用户按Up键后,屏幕从当前歌曲的上一首开始显示,光标也挪到上一首歌曲。光标当前屏幕的最后一首歌时的Down键处理也类似。

其他情况,不用翻页,只是挪动光标就行。

数据范围:命令长度,歌曲数量
进阶:时间复杂度:,空间复杂度:

输入描述:

输入说明:
1 输入歌曲数量
2 输入命令 U或者D



输出描述:

输出说明
1 输出当前列表
2 输出当前选中歌曲

示例1

输入

10
UUUU

输出

7 8 9 10
7
import sys

while True:
    try:
        n = int(input())
        moves = input().strip()
        positions = [0,1]
        pages = True
        scr = list()
        if n <= 4:pages = False
        for move in moves:
            if move =='U':
                if pages:
                    if positions[0] >0 : positions[0] -=1
                    elif positions[1] == 1: positions[0] =3
                positions[1] = positions[1]-1 if positions[1] > 1 else n
            if move == 'D':
                if pages:
                    if positions[0] <3 : positions[0] +=1
                    elif positions[1] == n: positions[0] =0
                positions[1] = positions[1]+1 if positions[1] < n else 1
        if pages:
            start = positions[1] - positions[0]
            for i in range(start,start+4): scr.append(i)
        else: 
            for i in range(1,n+1):scr.append(i)
        for i in scr:
            print(i,end = ' ')
        print()
        print(positions[1])
            

    except:
        break
管理需不需要翻页,管理光标在屏幕上的位置和对应序号,按部就班做就行了。不需要记录屏幕变动,有了前面的信息自然可以推出来最后的屏幕都有什么序号。
发表于 2024-09-24 21:01:46 回复(0)
SHOW_LINES = 4
while True:
    try:
        n = int(input())
        coms = input()
        if n < SHOW_LINES:  # 歌曲数目小于4时,显示行数以实际歌曲数目为准
            SHOW_LINES = n
        c, f = 1, SHOW_LINES  # ceiling, floor分别表示所显示最上面和最下面的行号
        cur = 1  # 光标位置
        for com in coms:
            if com == 'U':
                cur -= 1
            elif com == 'D':
                cur += 1
            if cur < c:  # 光标位置在ceiling以上,需修改ceiling与floor
                if c != 1:
                    c -= 1
                    f -= 1
                    cur = c
                else:  # 翻页,需修改ceiling与floor,并更新光标位置
                    c = n - SHOW_LINES + 1
                    f = n
                    cur = f
            elif cur > f:
                if f != n:
                    f += 1
                    c += 1
                    cur = f
                else:
                    d = 1 + SHOW_LINES -1
                    c = 1
                    cur = c
        for i in range(c, f+1):
            print(i, end=' ')
        print()
        print(cur)
    except:
        break

发表于 2024-08-12 16:28:56 回复(0)
n, s = int(input()), input()
dic_minling = {"U": -1, "D": 1}  # 按键对应的值
guangbiao, page1, page4 = 1, 1, min(4, n)  # 记录光标位置guangbiao,记录页面第一首、最后一首歌的位置page1、page4
for i in s:
    guangbiao += dic_minling[i]  # 根据按键改变光标位置
    if guangbiao == 0:  # 若光标在第一首歌按向上键,则当前页面page换页
        guangbiao = n
        page1, page4 = max(1, n - 3), n
    elif guangbiao == n + 1:  # 若光标在最后一首歌按向下键,则当前页面page换页
        guangbiao = 1
        page1, page4 = 1, min(4, n)
    elif guangbiao == page1 - 1 and page1 != 1:  # 若光标在当前页面第一首歌按向上键,则当前页面page向上减1
        page1, page4 = page1 - 1, page4 - 1
    elif guangbiao == page4 + 1 and page4 != n:  # 若光标在当前页面最后一首歌按向下键,则当前页面page向下加1
        page1, page4 = page1 + 1, page4 + 1

print(*list(range(page1, page4 + 1)))  # 输出当前页面第一首、最后一首歌的位置的列表
print(guangbiao)  # 输出当前光标对应的歌

发表于 2024-04-26 21:24:56 回复(0)
做出来了!
n=int(input())
s1=input()
y=1#起始歌曲数字
t=1#起始光标位置

for i in s1:
    if i=='U':
        if y==1:
            y=n
            if t==1:#第一首歌up光标变为最下面
                t=4          
        else:
            y=y-1
            if t==1:
                t=1
            else:
                t=t-1           
    if i=='D':
        if y==n:
            y=1
            if t==4:#最后一首歌Down光标变为最上面
                t=1            
        else:
            y=y+1
            if t==4:
                t=4
            else:
                t=t+1
#print(t)
m=y-t#根据数组和光标位置算出歌单最上面数字为y-t+1,为了循环输出取m
if n<=4:
    a=[i for i in range(1,n+1)]
    print(' '.join(list(map(str,a))),end='')
else:
    for i in range(4):
        m=m+1
        print(m,end=' ')
print()#专门换行
print(y)

发表于 2023-07-21 20:54:55 回复(0)
直接上答案,空间复杂度O(1):
while True: try:
        n=int(input())
        s=input()
        start=1  cur=1  if n<5: for _ in s: if _ == 'U': if cur == 1:
                        cur = n else:
                        cur -= 1  else: if cur == n:
                        cur = 1  else:
                        cur += 1  for i in range(1,n+1): print(i,end=' ') print('') print(cur) else: for _ in s: if _ == 'U': if cur==1:
                        start=n-3  cur=n else:
                        cur -= 1  if cur<start:
                            start -= 1   else: if cur==n:
                        start=1  cur=1  else:
                        cur+=1  if cur>start+3:
                            start+=1  print(start,start+1,start+2,start+3) print(cur) except: break  

发表于 2022-09-10 00:27:34 回复(0)
简简单单Python
n = int(input())
ops = input()

op_dict = {'U': -1, 'D':1}

index = 0

song_list = [i+1 for i in range(n)]

l = 0
r = 3 if n>=4 else n-1
index = 0
for i, op in enumerate(ops):
    index += op_dict[op]
    if index < l:
        if index < 0:
            index = index + n
            l = 0 if n < 4 else n - 1 - 4 + 1
            r = n - 1
        else:
            r -= 1
            l -= 1
    elif index > r:
        if index >= n:
            index = index - n
            l = 0
            r = n - 1 if n < 4 else 3
        else:
            l += 1
            r += 1
print(' '.join(map(str, song_list[l:r+1])))
print(song_list[index])
            


发表于 2022-09-06 00:39:36 回复(0)
n = int(input())
string = input()
nums = [i for i in range(1, n+1)]
#光标位置
i = 0
#第一首歌的索引
p = 0
for s in string:
    if i == 0 and s == 'U':
        i = n - 1
        p = n - 4
    elif i == n - 1 and s == 'D':
        i = 0
        p = 0
    elif s == 'U':
        i -= 1
        if i < p:
            p -= 1
    elif s == 'D':
        i += 1
        if (i-p) > 3:
            p += 1
        
for j in nums[p:p+4]:
    print(j, end=" ")
print()
print(i+1)
发表于 2022-09-03 21:18:38 回复(0)
length = int(input())
orders = input()
output = []
init = 1
if length <= 4:
    output = list(range(1,length + 1))
    for i in output:
        if i != output[-1]:
            print(i,end=" ")
        else:
            print(i,end="\n")
    amount = orders.count("D") - orders.count("U")
    direction = amount >= 0
    path = abs(amount) % length
    print(output[(2*direction-1) * path])
else:
    lists = list(range(1,length + 1))
    output = list(range(1,5))
    location = init
    for order in orders:
        if location == output[-1] and order == "D":
            if output[-1] == lists[-1]:
                output = lists[:4]
                location = output[0]
            else:
                location += 1
                output = output[1:] + [location]
        elif location == output[0] and order == "U":
            if output[0] == lists[0]:
                output = lists[-4:]
                location = output[-1]
            else:
                location -= 1
                output = [location] + output[:-1]
        else:
            if order == "U":
                location = output[output.index(location)-1]
            else:
                location = output[output.index(location)+1]
    for i in output:
        if i != output[-1]:
            print(i,end=" ")
        else:
            print(i,end="\n")
    print(location)

发表于 2022-08-27 22:52:05 回复(0)
while True:
    try:
        number_music = int(input())
        command = input()
#         print(command)
        start_pos = 1#具体数字
        list_music = []
        show_list = []
        for i in range(number_music):
            list_music.append(i+1)
#         print(list_music)
        if number_music<=4:
            for i in command:
                if i == 'U':
                    start_pos -= 1
                    if start_pos == 0:
                        start_pos = number_music
                elif i == 'D':
                    start_pos += 1
                    if start_pos == number_music + 1:
                        start_pos = 1
            show_list = list_music[0:number_music]
            for j in range(number_music):
                print(show_list[j],end=" ")
            print()
            print(start_pos)
        else:
            start_num = 0#数组位置 列表显示
            end_num =4#数组位置 列表显示
#             show_list = list_music[start_num:end_num]
            for i in command:
                if i == 'U':
                    start_pos -= 1
                    if start_pos == 0:
                        start_pos = number_music
                        end_num = number_music
                        start_num = end_num - 4 
                    else:
                        if start_pos < start_num + 1:
                            start_num -= 1
                            end_num -= 1
                        else:
                            pass
                elif i == 'D':
                    start_pos += 1
                    if start_pos == number_music + 1:
                        start_pos = 1
                        end_num = 4
                        start_num = 0
                    else:
                        if start_pos > end_num:
                            start_num += 1
                            end_num += 1
                        else:
                            pass
                        
            show_list = list_music[start_num:end_num]
#             print(start_pos)
            for j in range(4):
                print(show_list[j],end=" ")
            print()
            print(start_pos)

                    
    except:
        break
发表于 2022-08-01 13:47:02 回复(0)
while True:
    try:
        num = int(input())
        ops = input()
        
        # 定义光标的位置
        now = 0
        # 定义列表起点的位置
        start = 0
        lst = [x for x in range(1, 1+num)]
        for op in ops:
            if op == 'U':
                # 如果光标在第一个位置,向上运动则光标跳到最后一个位置,
                # 并且列表起点往前数4位
                if now == 0:
                    now = num - 1
                    start = num - 4
                else:
                    now = now - 1
                    if now < start:
                        start = start - 1
            else:
                if now == num - 1:
                    now = 0
                    start = 0
                else:
                    now = now + 1
                    if now > start + 3:
                        start = start + 1
        if num <= 4:
            print(*lst)
        else:
            print(*lst[start:start+4])
        print(lst[now])
            
    except:
        break


这个题我自己debug改了2个多小时,真难受。放在面试环节,基本就挂了
我只考虑光标的位置,却没有考虑列表起点的位置。看了大佬的题解就可以顺利实现了。
以后超过15分钟没写出来,还是直接看题解吧
发表于 2022-07-29 14:59:20 回复(0)
num = int(input())
opers = list(input())
cur = 1
if num >= 4:
    win = [1,2,3,4]
    for i in opers:
        if i == 'U':
            # 当前位置在窗口第一个
            if cur == win[0]:
                # 当前位置不等于1
                if cur != 1:
                    cur -= 1
                    win = [k for k in range(cur, cur + 4)]
                # 当前位置等于1
                else:
                    cur = num
                    win = [k for k in range(cur - 3, cur + 1)]
            else:
                cur -= 1

        elif i == 'D':
            # 当前位置在窗口最后一个:
            if cur == win[-1]:
                # 当前位置不等于tmp[-1]
                if cur != num:
                    cur += 1
                    win = [k for k in range(cur - 3, cur + 1)]
                else: 
                    cur = 1
                    win = [1,2,3,4]
            else:
                cur += 1
else:
    win = [k for k in range(1, num+1)]
    for i in opers:
        if i == 'U':
            cur -= 1
            if cur == 0:
                cur = num
            
        elif i == 'D':
            cur += 1
            if cur == num + 1:
                cur = 1
win = list(map(str, win))
print(' '.join(win))
print(cur)

发表于 2022-07-28 07:14:32 回复(0)
python3 cur_key, cur_list
while True:
    try:
        counts = int(input())
        orders = input()
        
        cur_key, cur_list = 1, []
        if counts <= 4:
            cur_list = [str(i+1) for i in range(counts)]
        else:
            cur_list = [str(i+1) for i in range(4)]
        for i in orders:
            if i == "U":
                if cur_key == 1:
                    cur_key = counts
                    if counts > 4:
                        cur_list = [str(i+1) for i in range(counts-4, counts)]
                else:
                    cur_key -= 1
                    if counts > 4 and cur_list[0] == str(cur_key+1):
                        cur_list = [str(int(i)-1) for i in cur_list]
            elif i == "D":
                if cur_key == counts:
                    cur_key = 1
                    if counts > 4:
                        cur_list = [str(i+1) for i in range(4)]
                else:
                    cur_key += 1
                    if counts > 4 and cur_list[-1] == str(cur_key-1):
                        cur_list = [str(int(i)+1) for i in cur_list]
        cur_list = " ".join(cur_list)
        print(cur_list)
        print(cur_key)
    except:
        break


发表于 2022-07-19 11:18:25 回复(0)
while True:
    try:
        n = int(input())
        strs = input()
        a = 1      #a表示界面第一行
        e = 1      #e 表示光标
        if n <= 4:    #不需要翻页的情况
            for i in range(1,n+1):   #根据实际歌曲数量输出,可能不到4首
                print(i,end=" ")
            print("")      #格式需求
            for i in strs:    #光标移动算法
                if i == "D":
                    e = e + 1
                    if e > n:
                        e = 1
                elif i == "U":
                    e = e - 1
                    if e < 1:
                        e = n
            print(e)    #输出光标
        elif 4 < n <= 150:            #歌曲数大于4的情况,需翻页
            for i in strs:
                if i == "D":        #向下翻页 Down
                    e = e + 1        #光标必定移动
                    if n >= e > 4:   #此情况下界面第一行可能移动
                        if a+3 < e:  #此情况下界面第一行一定移动
                            a = a + 1
                    elif e > n:      #回到页首
                        e = 1
                        a = 1
                elif i == "U":        #向上翻页 UP
                    e = e - 1        #光标必定移动
                    if e < 1:        #跳到页尾
                        e = n
                        a = n - 3
                    elif 1 <= e < n-3:    #此情况下界面第一行可能移动
                        if a > e:         #此情况下界面第一行一定移动
                            a = a - 1
            print(a,a+1,a+2,a+3)  #输出最后结果
            print(e)      
    except:
        break
#幸不辱命
发表于 2022-06-10 17:08:38 回复(0)
# 打开题解大家的代码都太长,完全没有看下去的欲望
#1.特殊情况特殊对待,从第一位置往上跳到末尾,从最后位置往下跳到开头
#2.光标位置比较容易判断,只要加上动作数值
#3.难点是屏显窗口内容的变化,定义loc_now记录光标位置在窗口中位置1~4,当loc_now数值在表化过程中超过范围就要进行重置,并移动屏显窗口位置
#


num = int(input())
move = input()
actions = {'U': -1, 'D': 1}
move_list = []
for i in move:
    move_list.append(actions[i])
num_list = [i for i in range(1, num + 1)]
now = 0  # 光标处在全局的位置
loc_now = 1  # 光标处在屏幕(4)的位置
loc_start = 0 #屏幕开始位置
loc_end = 3 #屏幕结束位置
for action in move_list:
    if now + action < 0:
        now = num - 1
        loc_now = 4
        loc_start = num - 4
        loc_end = num
    elif now + action > num-1:
        now = 0
        loc_now = 1
        loc_start = 0
        loc_end = 4
    else:
        now += action
        loc_now += action
        if loc_now < 1 or loc_now > 4:
            loc_now =1  if  loc_now < 1 else 4
            loc_start += action
            loc_end += action
print(' '.join([str(i) for i in num_list[loc_start:loc_end]]))
print(num_list[now])


发表于 2022-06-01 09:52:15 回复(0)
设置一个当前位置,和一个当前窗口,窗口里面只显示4个位置,当前位置在窗口内。up当前位置,如果超出窗口上边界,向上更新窗口。down当前位置,如果超出窗口下边界,向下更新窗口。
当前位置为5,窗口内容为【5,6,7,8】,操作up, 当前位置是4,窗口内容是【4,5,6,7】,而不是【1,2,3,4】尽管这更贴近真实情况。
def winup():
    global window
    if window[0] == 0:
        window[0] = n-4
        window[1] = n-1
    else:
        window[0] -= 1
        window[1] -= 1
def windown():
    global window
    if n-1 - window[1] > 0:
        window[0] += 1
        window[1] += 1
    else:
        window =[0,3]

while True:
    try:
        n = int(input())
        op = input()
        start = 0 #初始位置
        window = [0,3] #初始窗口,位置从0起符合习惯,到后面+1即为题目要求的位置
        flag = 0 if n <=3 else 1  #页数小于4,就不更新窗口
        for ch in op:
            if ch == 'U':
                start -= 1
                if flag == 1 and start < window[0]:
                    winup()  #向上更新窗口
                if start < 0:
                    start = n-1
            else:
                start += 1
                if flag == 1 and start > window[1]:
                    windown()  #向下更新窗口
                if start > n-1:
                    start = 0
        if flag == 0:
            window[1] = n-1
        res = [i for i in range(window[0],window[1]+1)]
        print(' '.join([str(i+1) for i in res]))
        print(start+1)
    except:
        break


发表于 2022-05-27 22:48:03 回复(0)
n = int(input())
cs = input()
# 当前选中歌曲
i = 1
# 当前选中歌曲位于屏幕位置
s = 1
for c in cs:
    if c=="D":
        s = min([s+1,4])    # 更新光标位于屏幕位置
        if i==n:            # 如果按之前,选中的是最后一首,按之后选中1,光标位于屏幕1
            i=1
            s=1
        else:
            i+=1
    elif c=="U":
        s = max([1,s-1])
        if i==1:            # 如果按之前,选中的是第一首,按之后选中n,光标位于屏幕4
            i=n
            s=4
        else:
            i-=1
# 屏幕显示的第一首歌曲为i-s+1,最后一首为i-s+4, 再去除编号小于1的(总曲目数小于4造成)
print(" ".join([str(i-s+1+x) for x in range(4) if x+i-s+1>0]))
print(i)

发表于 2022-05-20 19:57:45 回复(0)