首页 > 试题广场 >

MP3光标位置

[编程题]MP3光标位置
  • 热度指数:121553 时间限制: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
def f(n, option):
    global ll
    optional = [-1, 1]
    if n <= 4:
        cur = 1
        for st in option:
            if st == 'U':
                cur += optional[0]
                if cur < 1:
                    cur = n
            else:
                cur += optional[1]
                if cur > n:
                    cur = 1
        ll = [str(i) for i in range(1, n + 1)]
    else:
        cur = 1
        loc = 1
        for st  in option:
            if st  == 'U':
                cur = cur + optional[0]
                loc = loc + optional[0]
                if loc < 1 and cur < 1:
                    loc = 4
                elif loc < 1:
                    loc = 1
                if cur < 1:
                    cur = n
            else:
                cur = cur + optional[1]
                loc = loc + optional[1]
                if loc > 4 and cur > n:
                    loc = 1
                elif loc > 4:
                    loc = 4
                if cur > n:
                    cur = 1
            star = 1 - loc + cur
            end = 4 - loc + cur
            ll = [str(i) for i in range(star, end+1)]
    return ll, cur
while True:
    try:
        n = int(input())
        option = input()
        ll, cur = f(n, option)
        print(' '.join(ll))
        print(cur)
    except:
        break
发表于 2021-03-15 01:09:15 回复(0)
while 1:
    try:
        def display(num,action):
            l=[]
            for i in range(1,num+1):
                l.append(i)

            cnt=action.count('D')%num-action.count('U')%num
            p=cnt

            if p<0:
                p+=num

            if num<4:
                for i in range(len(l)):
                    l[i]=str(l[i])
                print(" ".join(l))
                print(p+1)
            else:
                if p>num-4:
                    for j in range(1,4):
                        l.append(j)

                for i in range(p,p+4):
                    l[i]=str(l[i])
                print(" ".join(l[p:p+4]))
                print(p+1)

        num1=int(input())
        action1=input()

        display(num1,action1)
    except:
        break

自己本地IDE都没问题,上传过不去,求大神解答哪里出了问题,感觉逻辑清晰着呢呀
编辑于 2021-02-11 13:02:35 回复(0)
def move_in_window(order):
    global index, size
    if order == "U":
        if index == 0:
            return -1
        else:
            index -= 1
    else:
        if index == size-1:
            return 1
        else:
            index += 1
            
            
def move_window(drct):
    global l, r, index, n
    if drct == -1:
        if l == 1:
            l ,r, index = n-3, n, 3
        else:
            l, r = l-1, r-1
    else:
        if r == n:
            l, r, index = 1, 4, 0
        else:
            l, r = l+1, r+1


while True:
    try:
        n, orders = int(input()), input()
        index, size = 0, n if n<4 else 4
        l, r = 1, size
        for o in orders:
            drct = move_in_window(o)
            if drct and n > 4:
                move_window(drct)
        output = [str(i) for i in range(l, l+size)]
        print(" ".join(output))
        print(output[index])
    except:
        break

发表于 2020-12-17 22:36:16 回复(0)
用滑动窗口截歌曲列表,逻辑清楚,条例清晰
while True:
    try:
        n, s, w_size = int(input()), input(), 4
        # 歌曲列表 按照题目要求 填充 1-n
        songList = [i+1 for i in range(n)]
        # 起始歌曲游标 和 窗口游标 以及 起始窗口内容
        window = [songList[i] for i in range(min(w_size, n))]
        song_p, w_p = 0, 0
        for i in s:
            if i == 'D':
                song_p += 1
                w_p += 1
                if song_p > n - 1:
                    window = [songList[i] for i in range(min(w_size, n))]
                    song_p, w_p = 0, 0
                if w_p > w_size - 1:
                    w_p = w_size - 1
                    window.append(songList[song_p])
                    window.pop(0)
            else:
                song_p -= 1
                w_p -= 1
                if song_p < 0:
                    window = [songList[i] for i in range(max(0, n - w_size), n)]
                    song_p, w_p = n - 1, min(w_size - 1, n - 1)
                if w_p < 0:
                    w_p = 0
                    window.insert(0, songList[song_p])
                    window.pop()
        print(' '.join(map(str, window)))
        print(songList[song_p])
    except:
        break


发表于 2020-09-29 21:41:59 回复(1)
while True:
    try:
        n = int(input())
        button = input()
        s_page = [1, 2, 3, 4] if n > 4 else [j for j in range(1, n+1)]
        e_page = [k for k in range(n-3, n+1)] if n > 4 else s_page[:]
        cur_page = s_page[:]
        current = 1
        for value in button:
            if 'D' == value:
                if current == n:
                    current = 1
                    cur_page = s_page[:]
                else:
                    current += 1
                    if current == cur_page[-1] + 1:
                        cur_page.pop(0)
                        cur_page.append(current)
            elif 'U' == value:
                if current == 1:
                    current = n
                    cur_page = e_page
                else:
                    current -= 1
                    if current == cur_page[0] - 1:
                        cur_page.pop()
                        cur_page.insert(0, current)
        print(' '.join(map(str, cur_page)))
        print(current)
    except:
        break

发表于 2020-08-17 13:07:52 回复(0)
调了一下午,测试中的边界条件主要考虑后四个前四个元素之间切换,我的考虑了更多的边界条件
while True:
    try:
        N,s = eval(input()),input()
        ls = [str(i) for i in range(1,N+1)]
        if N <= 4:
            pos = 1
            for k in s:
                if k == 'D' and pos != N:
                    pos += 1
                elif k == 'D' and pos == N:
                    pos = 1
                elif k == 'U' and pos != 1:
                    pos -= 1
                elif k == 'U' and pos == 1:
                    pos = N
            print(' '.join(ls))
            print(pos)
        elif N > 4:
            pos,m,n = 0,0,3
            for k in s:
                if k == 'D' and pos < n:
                    pos = pos+1
                elif k == 'D' and pos == n:
                    pos = pos+1
                    m += 1
                    n += 1
                elif k == 'U' and pos > m:
                    pos = pos-1
                elif k == 'U' and pos == m:
                    pos = pos-1
                    m -= 1
                    n -= 1
            if m>0 and n>0 and m//N != n//N:
                if str(pos%N+1) in ls[:4]:
                    print(' '.join(ls[:4]))
                elif str(pos%N+1) in ls[-4:]:
                    print(' '.join(ls[-4:]))
                print(pos%N+1)
            elif m<0 and n<0 and (m+1)//N != (n+1)//N:
                if str(pos%N+1) in ls[:4]:
                    print(' '.join(ls[:4]))
                elif str(pos%N+1) in ls[-4:]:
                    print(' '.join(ls[-4:]))
                print(pos%N+1)
            elif m>0 and n>0 and m//N == n//N:
                print(' '.join(ls[m%N:n%N+1]))
                print(pos%N+1)
            elif m <0 and n<0 and abs(m+1)//N == abs(n+1)//N:
                print(' '.join(ls[m%N:n%N+1]))
                print(pos%N+1)
            elif m<0 and n>0:
                if str(pos%N+1) in ls[:4]:
                    print(' '.join(ls[:4]))
                elif str(pos%N+1) in ls[-4:]:
                    print(' '.join(ls[-4:]))
                print(pos%N+1)
            elif m == 0 and n == 3:
                print(' '.join(ls[:4]))
                print(pos%N+1)
            elif n == 0 and m == -3:
                print(' '.join(ls[-4:]))
                print(pos%N+1)
    except:
        break

编辑于 2020-05-22 20:19:50 回复(0)
while 1:
    try:
        num, operation      = int(input()), input()
        loc_all, loc_screen = 1, 1
        if num<=4:
            for ope in operation:
                if ope == 'U':
                    loc_all = num-(num-loc_all+1)%num
                else:
                    loc_all = (loc_all+1)%num
            for i in range(1,num+1,1):
                print(i,end='')
                if i != num:
                    print('',end=' ')
                else:
                    print('')
            print(loc_all)
        else:
            for ope in operation:
                if ope == 'U':
                    if loc_all == 1:
                        loc_all    = num
                        loc_screen = 4
                    elif loc_screen == 1:
                        loc_all    -= 1
                    else:
                        loc_all    -= 1
                        loc_screen -= 1
                else:
                    if loc_all == num:
                        loc_all    = 1
                        loc_screen = 1
                    elif loc_screen == 4:
                        loc_all    += 1
                    else:
                        loc_all    += 1
                        loc_screen += 1
            for i in range(1,5,1):
                    print(loc_all+i-loc_screen,end='')
                    if i != 4:
                        print('',end=' ')
                    else:
                        print('')
            print(loc_all)

    except:
        break
要考虑歌单长度小于4的情况,其他情况用两个位置变量操作即可
发表于 2020-05-08 17:49:26 回复(0)
class MP:
    def __init__(self,length):
        self.length = length
        self.cur = 0
        if length > 4:
            self.screen = [1,2,3,4]
        else:
            self.screen = [i for i in range(1,length+1)]
        
    def leng(self):
        if self.length > 4:
            return 4
        else:
            return self.length
        
    def up(self):
        if self.length < 4:
            self.cur = (self.cur - 1)%self.leng()
        elif self.cur > 0:
            self.cur -= 1
        else:
            if self.screen[self.cur] == 1:
                self.screen = [i for i in range(self.length+1-self.leng(),self.length+1)]
                self.cur = (self.cur - 1)%self.leng()
            else:
                self.screen = [i-1 for i in self.screen]
                
    def down(self):
        if self.length < 4:
            self.cur = (self.cur + 1)%self.leng()
        elif self.cur < self.leng()-1:
            self.cur += 1
        else:
            if self.screen[self.cur] == self.length:
                self.screen = [i for i in range(1,self.leng()+1)]
                self.cur = (self.cur + 1)%self.leng()
            else:
                self.screen = [i+1 for i in self.screen]
                
    def show_screen(self):
        if self.leng() == 1:
            print(self.screen[0])
        else:
            for i in range(self.leng()-1):
                print(self.screen[i],end=" ")
            print(self.screen[self.leng()-1])
            
    def show_index(self):
        print(self.screen[self.cur])
        
while True:
    try:
        n = int(input())
        command = list(input())
        A = MP(n)
        for com in command:
            if com == 'U':
                A.up()
            elif com == 'D':
                A.down()
        A.show_screen()
        A.show_index()
    except:
        break
发表于 2020-04-05 23:11:09 回复(1)
简单粗暴

运行时间:29ms

占用内存:3552k


while 1:
    try:
        n = int(input())
        aln = list(range(n))
        m = input()
        margin = 4 if n >= 4 else n
        this = 0
        screen = aln[:margin] 
        for i in m:
            if i == 'U': 
                this -= 1
                if this not in screen:
                    if this == -1:
                        this = n-1
                        screen = aln[-margin:]
                    else:
                        screen = aln[this:this+margin]
            else: 
                this += 1
                if this not in screen:
                    if this == n:
                        this = 0
                        screen = aln[:margin]
                    else:
                        screen = aln[this-margin+1:this+1]

        print(' '.join([str(i+1) for i in screen]))
        print(aln[this]+1)
        
    except:
        break


编辑于 2020-02-25 22:13:53 回复(0)
while True:
    try:
        N = int(input())
        CD = input()
        pos = 0
        uedge = 0
        dedge = 3
        for act in CD:
            if act == 'U':
                pos-=1
                pos%=N
            elif act == 'D':
                pos+=1
                pos%=N
            if pos < uedge:
                uedge = pos
                dedge = uedge+3
            elif pos > dedge:
                dedge = pos
                uedge = dedge-3
        uedge+=1
        print(' '.join([str(uedge),str(uedge+1),str(uedge+2),str(uedge+3)])[:N+1])
        print(str(pos+1))            
    except:
        break
简单有效
发表于 2020-02-19 16:58:17 回复(2)
while True: try:
        n = int(input())
        arr = [_ for _ in range(n+1)]
        queue = [1, 2, 3, 4]
        incoder = input()
        incoder = list(incoder)
        index = 1  if n<=4:
            queue = list(map(str, arr[1:])) print(' '.join(queue))
            index = 1  while incoder:
                code = incoder[0]
                incoder.pop(0) if code=='U' and index==1:
                    index=n elif code=='D' and index==n:
                    index=1  elif code=='U':
                    index-=1  else:
                    index+=1  print(index) else: while incoder:
                code = incoder[0]
                incoder.pop(0) if code=='U' and index==1:
                    queue=[n-3, n-2, n-1, n]
                    index = n elif code=='D' and index==n:
                    queue = [1, 2, 3, 4]
                    index = 1  elif code=='U':
                    index-=1  if index<min(queue):
                        queue.pop()
                        queue.insert(0, index) elif code=='D':
                    index+=1  if index>max(queue):
                        queue.pop(0)
                        queue.append(index)
            queue = list(map(str, queue)) print(' '.join(queue)) print(index) except: break
发表于 2019-09-03 21:03:02 回复(0)
while True:
    try:
        nums = int(input())
        cmds = input()
        cur,begin = 1,1
        for cmd in cmds:
            if cmd == 'D':
                cur += 1
                if cur > nums:
                    cur = begin = 1
                if cur - begin > 3:
                    begin += 1
            else:
                cur -= 1
                if cur == 0:
                    cur = nums
                    begin = nums-3
                if cur < begin:
                    begin -= 1
        if nums < 4:
            l = list(range(1,nums+1))
            song = ''
            for i in l:
                song += str(i)+" "
            print(song)
        else:
            song = ''
            l = list(range(begin,begin+4))
            song = ''
            for i in l:
                song += str(i)+" "
            print(song)
        print(cur)
    except:
        break


编辑于 2019-06-16 18:45:08 回复(0)
/*看掉了初始位置为1了,之前结果总是错位……,用一个变量来保存光标,一个数组来模拟歌曲列表,
然后对每种情况进行判断,渣渣只会笨办法……*/
def getFacous(n,ins):
    temp = 1
    song = list(range(1,n+1))
    if n <= 4:
        for i in ins:
            if i == "U":
                temp -= 1
                if temp < 1:
                    temp = n
                if temp > n:
                    temp = 1
        return (song,temp)
    else:
        song = [n-3,n-2,n-1,n]
        for i in ins:
            if i == 'U':
                temp -= 1
                if temp < song[0]:
                    if temp <= 0:
                        temp = n
                        song = [n-3,n-2,n-1,n]
                    else:
                        song.insert(0,temp)
                        song.pop()
            elif i == 'D':
                temp += 1
                if temp > song[3]:
                    if temp > n:
                        temp = 1
                        song = [1,2,3,4]
                    else:
                        song.append(temp)
                        song.pop(0)
        return (song,temp)

while True:
    try:
        n = int(input())
        ins = input()
        res = getFacous(n,ins)
        song = ''
        for i in res[0]:
            song += str(i)+" "
        index = res[1]
        print(song)
        print(index)
    except:
        break

发表于 2018-09-01 19:06:01 回复(0)

问题信息

难度:
17条回答 20795浏览

热门推荐

通过挑战的用户

查看代码