首页 > 试题广场 >

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
import java.util.Scanner;

// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int total = Integer.parseInt(sc.nextLine());
        String operations = sc.nextLine();
        int[] data = new int[total];
        for (int i = 0; i < total; i++) {
            data[i] = i + 1;
        }
        int size = total < 4 ? total : 4;
        int[] win = new int[size];
        for (int i = 0; i < size; i++) {
            win[i] = i + 1;
        }
        int[] initWin = new int[size];
        System.arraycopy(win, 0, initWin, 0, win.length);
        int cur = 0;
        for (int i = 0; i < operations.length(); i++) {
            char oper = operations.charAt(i);
            if (oper == 'U') {
                if (win[cur] == data[0]) {
                    // 第一个数,total>4,窗口到底,光标到底
                    // 第一个数,total<=4,窗口不动,光标到len-1
                    if (total > 4) {
                        for (int j = 0; j < 4; j++) {
                            win[j] = data[total - 1 - (3 - j)];
                        }
                        cur = 3;
                    } else {
                        cur = total - 1;
                    }
                } else {
                    // 光标=0,窗口上移,光标不动
                    // 光标>0,窗口不动,光标-1
                    if (cur == 0) {
                        moveWin(win, -1);
                    } else {
                        cur--;
                    }
                }
            } else if (oper == 'D') {
                if (win[cur] == data[total - 1]) {
                    // 最后一个数:窗口重置,光标重置
                    System.arraycopy(initWin, 0, win, 0, initWin.length);
                    cur = 0;
                } else {
                    if (cur < 3) {
                        // 光标<3:窗口不动,光标+1
                        cur++;
                    } else {
                        // 光标=3(底部),窗口下移1,光标不动
                        moveWin(win, 1);
                    }
                }
            } else {
                throw new RuntimeException("invalid oper");
            }
        }
        for (int v : win) {
            System.out.print(v + " ");
        }
        System.out.println();
        System.out.println(win[cur]);
    }

    private static void moveWin(int[] win, int dt) {
        for (int i = 0; i < win.length; i++) {
            win[i] = win[i] + dt;
        }
    }
}

编辑于 2024-03-22 01:10:37 回复(0)
import java.util.Scanner;

// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        int cnt = in.nextInt();
        in.nextLine();
        String mv = in.nextLine();
        int finalCursor = 1;
        int pageSize = cnt >= 4 ? 4 : cnt;
        int curPageCursor = 1;//光标在当前页的位置,只能是1-pageSize
        //得到最终光标所在位置
        for (int i = 0; i < mv.length(); i++) {
            if(mv.charAt(i) == 'D') {
                finalCursor++;
                //如果光标所在位置小于页大小,则位置加1,否则为不同向下翻页,位置不变
                if (curPageCursor < pageSize) {
                    curPageCursor++;
                }
                if (finalCursor > cnt) {
                    finalCursor = 1;
                    curPageCursor = 1;//向下特殊翻页,光标挪到开始
                }
            } else if (mv.charAt(i) == 'U') {
                finalCursor--;
                //如果光标所在当前页位置大于1,则位置减一,否则为普通向上翻页,位置不变
                if (curPageCursor > 1) {
                    curPageCursor--;
                }
                if (finalCursor < 1) {
                    finalCursor = cnt;
                    curPageCursor = pageSize;//向上特殊翻页,光标位置挪到最后
                }
            }
        }
        //通过当前光标所在页中的位置和所在序号可以计算出当前页显示的所有序号
        for (int i = finalCursor - curPageCursor + 1; i <= finalCursor + (pageSize - curPageCursor); i++) {
            System.out.print(i + " ");
        }
        System.out.println();
        System.out.println(finalCursor);
    }
}

编辑于 2024-02-06 12:15:46 回复(0)
import java.util.Scanner;

// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        int n = in.nextInt();
        in.nextLine();
        int k = 1;
        String op = in.nextLine();
        int start = 1;
        int end = Math.min(4, n);
        for (int i = 0; i < op.length(); i++) {
            if (op.charAt(i) == 'U') {
                if (k == 1) {
                    k = n;
                }else {
                    k--;
                }
            } else {
                k = k % n + 1;
            }
            if (k < start) {
                start = k;
                end = start + 3;
            } else if (k > end) {
                end = k;
                start = end - 3;
            }
        }
        for (int i = start; i <= end; i++) {
            System.out.print(i + " ");
        }
        System.out.println("\n" + k);
    }
}

发表于 2023-11-26 01:49:31 回复(0)
直接维护两个int值,一个记录当前页第一个index,另一个记录当前歌曲的index
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        int n=in.nextInt();
        in.nextLine();
        char[] ins=in.nextLine().toCharArray();
        int first=0;
        int curr=0;
        for(int i=0;i<ins.length;i++){
            if(ins[i]=='U'){
                curr=(curr+n-1)%n;
                if(curr<first){
                    first=curr;
                }else if(curr>first+3){
                    first=curr>=3?curr-3:0;
                }
            }else if(ins[i]=='D'){
                curr=(curr+n+1)%n;
                if(curr>first+3){
                    first=curr>=3?curr-3:0;
                }else if(curr<first){
                    first=curr;
                }
            }
        }
        int i=1;
        int l=Math.min(n,4);
        while(i<l){
            System.out.print((first+i++)+" ");
        }
        System.out.println((first+l));
        System.out.print(curr+1);
    }
}


发表于 2023-09-08 01:14:29 回复(0)
import java.util.Scanner;

// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
    public static void func(int n,String str){
        //初始时光标所在位置
        int first=1;
        int mouse=1;
        char []index=str.toCharArray();
        if(n<=4){
            for(int i=0;i<index.length;i++){
                //光标在第一首歌曲上时,按Up键光标挪到最后一首歌曲
                if(mouse==1&&index[i]=='U'){
                    mouse=n;
                }
                //光标在最后一首歌曲时,按Down键光标挪到第一首歌曲
                else if(mouse==n&&index[i]=='D'){
                    mouse=1;
                }
                //用户按Up键,光标挪到上一首歌曲
                else if(index[i]=='U'){
                    mouse--;
                }
                //用户按Down键,光标挪到下一首歌曲
                else{
                    mouse++;
                }
            }
            for(int i=1;i<n;i++){
                System.out.print(i+" ");
            }
            System.out.println(n);
            System.out.println(mouse);
        }else{
            for(int i=0;i<index.length;i++){
                // 屏幕显示的是第一页(即显示第1 – 4首)时,光标在第一首歌曲上,用户按Up键后,屏幕要显示最后一页(即显示第7-10首歌),同时光标放到最后一首歌上
                if(first==1&&mouse==1&&index[i]=='U'){
                    mouse=n;
                    first=n-3;
                }
                // 同样的,屏幕显示最后一页时,光标在最后一首歌曲上,用户按Down键,屏幕要显示第一页,光标挪到第一首歌上。
                else if(first==mouse-3&&mouse==n&&index[i]=='D'){
                    first=1;
                    mouse=1;
                }
                //屏幕显示的不是第一页时,光标在当前屏幕显示的第一首歌曲时,用户按Up键后,屏幕从当前歌曲的上一首开始显示,光标也挪到上一首歌曲。
                else if(first!=1&&mouse==first&&index[i]=='U'){
                    first--;
                    mouse--;
                }
                // 光标当前屏幕的最后一首歌时的Down键处理也类似
                else if(mouse!=n&&first==mouse-3&&index[i]=='D'){
                    mouse++;
                    first++;
                }
                // 其他情况,不用翻页,只是挪动光标就行
                else if(index[i]=='U'){
                    mouse--;
                }
                else if(index[i]=='D'){
                    mouse++;
                }
            }
            for(int i=first;i<first+3;i++){
                System.out.print(i+" ");
            }
            System.out.println(first+3);
            System.out.println(mouse);
        }
    }
    public static void main(String[] args) {
        Scanner in=new Scanner(System.in);
        int n=in.nextInt();
        // String tmp=in.next();
        String str=in.next();
        func(n,str);
    }
}

发表于 2023-08-12 22:54:09 回复(0)
就是按照指针是否超出边界来更新显示框的上下界,要注意的就是指针跳转到表头和表尾的时候,给上下界分别重定义,然后按照上下界确定索引之后去截取歌曲数组输出就好。
代码可能比较臃肿,见笑了。
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        while (in.hasNext()) {
            int n = in.nextInt();
            String str = in.next();
            songList sl = new songList(n);
            sl.control(str, sl);
            sl.show(sl);
        }
    }
}

class songList {
    private int songNumber;
    private int nowSong;
    private int[] showSong;
    private int start = 0;
    private int end = start + 3;

    public songList(int n) {
        this.songNumber = n;
        this.nowSong = 0;
        this.showSong = new int[n];
        for (int i = 0; i < n; i++) {
            showSong[i] = i + 1;
        }
    }

    public void up(songList sl) {
        nowSong--;
        if (nowSong == -1) {
            nowSong = sl.songNumber - 1;
            start = Math.max(songNumber - 4, 0);
            end = songNumber - 1;
        } else if (nowSong == start - 1 && start != 0) {
            start--;
            end--;
        }
    }

    public void down(songList sl) {
        nowSong++;
        if (nowSong == sl.songNumber) {
            nowSong = 0;
            start = 0;
            end = Math.min(3, songNumber - 1);
        } else if (nowSong == end + 1 && end != songNumber - 1) {
            start++;
            end++;
        }
    }

    public void show(songList sl) {
        for (int i = sl.start; i <= sl.end; i++) {
            System.out.print(showSong[i] + " ");
        }
        System.out.println();
        System.out.print(nowSong+1);
    }

    public void control(String s, songList sl) {
        for (int i = 0; i < s.length(); i++) {
            if (s.charAt(i) == 'U') {
                up(sl);
            } else if (s.charAt(i) == 'D') {
                down(sl);
            }
        }
    }
}

发表于 2023-06-19 10:55:35 回复(0)
import java.util.Scanner;

// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        // 注意 hasNext 和 hasNextLine 的区别
        while (in.hasNext()) { // 注意 while 处理多个 case
            int n = in.nextInt();
            String str = in.next();
            int index = 1;
            int start = 1;
            int end = Math.min(4,n);
            for(int i = 0 ; i < str.length() ; i++){
                if(str.charAt(i)=='U'){
                    if(index==1){
                        index = n;
                    }else{
                        index--;
                    }
                }else{
                    index = index % n + 1;
                }
                if(index<start){
                    start = index;
                    end = start + 3;
                }else if(index>end){
                    end = index;
                    start = end - 3;
                }
            }
            for(int i = start ; i <= end ; i++){
                System.out.print(i + " ");
            }
            System.out.println();
            System.out.println(index);
        }
    }
}

发表于 2023-06-01 10:36:43 回复(0)
import java.util.*;
//cur的变化量只能为1,方向根据op判定
//l的变化量dl只能是0,1,4三种,方向根据op判定
//n<=4时,                    => dl=0
//up时,  cur>l,              => dl=0
//down时,cur<l+3,            => dl=0
//up时,  cur==0,             => dl=4
//down时,cur==n-1,           => dl=4
//up时,  cur!=0, cur=l,      => dl=1
//down时,cur!=n-1, cur==l+3, => dl=1
public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        while (in.hasNext()) {
            int n = in.nextInt();
            String operations = in.next();
            int l =0;
            int cur = 0;
            for (int i = 0; i < operations.length(); i++) {
                int op =operations.charAt(i)=='U'?-1:1;//指定变换方向
                int dl = operations.charAt(i)=='U'?(cur>l?0:(cur==0?4:1)):(cur<l+3?0:(cur==n-1?4:1));
                dl=n<=4?0:dl;
                cur=(cur+n+op)%n;//加了变化量后需要模运算免得超出范围 +n是保证不为负数
                l=(l+n+op*dl)%n;
            }
            int max =Math.min(n,4);
            for (int i = 0; i < max; i++) {
                System.out.print(l+1+i);
                if(i<max-1){
                    System.out.print(" ");
                }else{
                    System.out.println();
                }
            }
            System.out.println(cur+1);
        }
    }
}

发表于 2023-03-22 15:03:46 回复(0)
各种踩坑。
1:分n大于4和小于等于4,小于等于4好处理,无非是当前光标位置的变化,当前页面的开始位置不会变。坑主要在大于4的情况
2、坑1:最后一页的歌曲数量一定是4,因此跳到最后一页时,开始位置是n-3。坑2:页面的开始位置不是一定变化的,只有UP时,光标位置等于开始位置,或者DOWN时,光标位置减开始位置等于4时,开始位置才会变化。
发表于 2023-03-01 16:30:29 回复(0)
import java.util.Scanner;

public class Main {

    private static int screenSize = 4;
    private static int point = 1;
    private static int screenTop = 1;

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        while (sc.hasNext()) {
            int count = sc.nextInt();
            if(count < screenSize) {
                screenSize = count;
            }
            String inputStr = sc.next();
            char[] inputs = inputStr.toCharArray();
            // 如果当前指针在最低部,input是D则需要向下移动或者翻页
            // 如果当前指针在最顶部,input是U则需要向上移动或者翻页
            int current = 1;
            for (char input : inputs) {
                current = getCurrentpoint(input, current, 1, count);
            }
            StringBuilder sb = new StringBuilder();
            for (int k = 0; k < screenSize; k++) {
                sb.append(screenTop + k).append(" ");
            }
            System.out.println(sb.toString());
            System.out.println(current);
            
        }
        sc.close();
    }

    public static int getCurrentpoint(char button, int current, int top, int bottom) {
        if(button == 'D') {
            if (current < bottom) {
                if (point < screenSize) {
                    point++;
                } else {
                    screenTop++;
                }
               current++; 
            } else {
                point = 1;
                screenTop = 1;
                current = 1;
            }
            
        } else {
            if (current > top) {
                if (point > 1) {
                    point--;
                } else {
                    screenTop--;
                }
                current--;
            } else {
                point = screenSize;
                screenTop = bottom - screenSize + 1;
                current = bottom;
            }
            
        }
        return current;
    } 
}

发表于 2023-02-01 21:08:54 回复(0)
import java.util.Scanner;

// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        int n = in.nextInt();//光标下移
        String u = in.nextLine();
        int k = 4;//屏幕上显示的歌单数量
        if (n < 4)k = n;
        String str = in.nextLine();//操作指令
        int music = 1;//光标指向的音乐编号
        int cur = 1;//光标在屏幕上的位置
        int head = 1;//屏幕显示的第一个歌曲编号
        for (int i = 0; i < str.length(); i++) {
            if (str.charAt(i) == 'U') {
                if (cur == 1) {//指针在顶部
                    if (music == 1) {//顶部的歌曲编号为第一个
                        music = n + 1;
                        head = n - k + 1 ;
                    } else {
                        head--;
                    }
                    cur = k + 1;

                }
                music--;
                cur--;

            }
            if (str.charAt(i) == 'D') {
                if (cur == k) {//指针在底部
                    if (music == n) {//底部的歌曲编号为最后一个
                        music = 0;
                        head = 1;
                    } else {
                        head++;
                    }
                    cur = 0;

                }
                music++;
                cur++;
            }
        }
        for(int i=0;i<k;i++){
            System.out.print(head+i+" ");
        }
        System.out.println("");
        System.out.println(music);
    }
}
发表于 2022-10-30 17:28:47 回复(0)
定义窗口边界,并记录当前歌曲位置,根据按键判断是否需要移动边界
import java.util.*;

public class Main {
    public static void main(String[] args){
        Scanner scanner = new Scanner(System.in);
        String str = scanner.nextLine();
        Integer number = Integer.parseInt(str);
        String command = scanner.nextLine();
        printCurrentMusic(number, command);
    }
    
    public static void printCurrentMusic(Integer number, String command){
        int head = 1;
        int end = number>4 ? 4 : number;
        int curr = 1;
        char[] chars = command.toCharArray();
        for (char aChar : chars) {
            if(String.valueOf(aChar).equals("U")) {
                if(curr == 1){
                    curr = number;
                    head = Math.max((number - 3), 1);
                    end = curr;
                }else{
                                        //重点是这里,判断是否需要移动边界,由于上面判断杜绝了边界重置,这里直接移动即可,下面判断同样,注意这里判断与curr位置不可反
                    if(curr == head){
                        head --;
                        end --;
                    }
                    curr --;
                }
            }else if(String.valueOf(aChar).equals("D")){
                if(curr == number){
                    curr = 1;
                    head = 1;
                    end = number>4 ? 4 : number;
                }else{
                    if(curr == end){
                        head ++;
                        end ++;
                    }
                    curr ++;
                }
            }
        }
        for(int i = head; i <= end; i ++){
            System.out.print(i + " ");
        }
        System.out.println("\n" + curr);
    }
    
}


发表于 2022-08-29 20:57:06 回复(0)
用滑动窗口来框选,如果当前歌曲没有走出窗口,窗口就不需要移动,否则就要分情况讨论窗口的移动情况。可以分为四种情况,向上翻到尾页,向下翻到首页,向上移动一格窗口,向下移动一格窗口。
运行时间:13ms
超过92.67% 用Java提交的代码
占用内存:9576KB
超过90.87%用Java提交的代码
public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int size = Integer.parseInt(br.readLine());
        char[] orders = br.readLine().toCharArray();
        int cur = 0;
        int upper = 0, lower = Math.min(3, size - 1);
        for (char order : orders) {
            int motion = order == 'U' ? -1 : 1;
            if (size > 4) {
                if (cur == 0 && motion == -1) {
                    upper = size - 4;
                    lower = size - 1;
                } else if (cur == size - 1 && motion == 1) {
                    upper = 0;
                    lower = 3;
                } else if (cur == upper && motion == -1) {
                    upper--;
                    lower--;
                } else if (cur == lower && motion == 1) {
                    upper++;
                    lower++;
                }
            }
            cur = (cur + motion + size) % size;
        }

        StringBuilder sb = new StringBuilder();
        for (int i = upper; i <= lower; i++) {
            sb.append(i + 1).append(' ');
        }

        System.out.println(sb);
        System.out.println(cur + 1);
    }
}



发表于 2022-08-13 12:28:57 回复(0)
import java.util.Scanner;
/**
 * @author YXQ
 * @create 2022/8/6  17:24
 */
public class Main {
    static int l;
    static int r;
    public static void main(String[] args) {
//        System.out.println((11+100)%10);
        Scanner sc=new Scanner(System.in);
        int n=sc.nextInt();
        int[] contant=new int[n];
        for(int i=0;i<n;i++) contant[i]=i+1;
        sc.nextLine();
        String str=sc.nextLine();
        int[] ops=new int[str.length()];
        for(int i=0;i<str.length();i++){
            if(str.charAt(i)=='U')ops[i]=-1;
            else if(str.charAt(i)=='D')ops[i]=1;
        }
        int pix=getSceen(contant,ops);
        for(int i=l;i<=r;i++) System.out.print(contant[i]+" ");
        System.out.println();
        System.out.println(pix);


    }
    public static int getSceen(int[] contant,int[] ops){
        if(contant.length<=4){
            l=0;
            r=contant.length-1;
            int num=0;
            for(int i=0;i<ops.length;i++)num+=ops[i];
            return (contant[(num+contant.length)%contant.length]);
        }
        l=0;
        r=3;
        int num=0;
        int state=1;
        int i=0;
        boolean flag;
        while (i<ops.length){
//            step1初始状态
            int step1=0;
            flag=false;
            if(state==1||state==4){
                while (i<ops.length&&step1!=-1&&step1!=4){
                    step1+=ops[i];
                    num+=ops[i];
                    i++;
                }
                if(step1==-1||step1==4)flag=true;
            }
            else if(state==2||state==3){
                while (i<ops.length&&step1!=-4&&step1!=1){
                    step1+=ops[i];
                    num+=ops[i];
                    i++;
                }
                if(step1==-4||step1==1)flag=true;
            }
           if(flag) state=LRMove(contant,step1);
        }

        return (contant[(num+contant.length)%contant.length]);


    }
    public static int LRMove(int[] contant,int step){
        int state=0;
        if(step==-1||step==-4){
            if(l==0){
                r=contant.length-1;
                l=contant.length-4;
                state=2;//状态2  向上可以找4个才跳,向下找一个就会跳
            }else{
                l--;
                r--;
                state=4;//状态4  向上一个跳界面  向下4个才跳
            }
        }
        else if(step==4||step==1){
           if(r!=contant.length-1){
               l++;
               r++;
               state=3;//状态3  向下一步跳界面,向上4个跳界面
           }else{
               l=0;
               r=3;
               state=1;//下4 上1
           }
        }

        return state;
    }
}

发表于 2022-08-11 17:36:09 回复(0)
滑动窗口
import java.util.*;

public class Main {

    public static void main(String[] args) {

        Scanner scanner = new Scanner(System.in);

        int amount = scanner.nextInt();
        String ud = scanner.next();

        int lift = 1;
        int right = Math.min(amount,4);
        int index = 1;

        for (int i = 0; i < ud.length(); i++) {
            if (ud.charAt(i) == 'U' && index == 1) {
                index = amount;
                lift = amount > 4 ? amount - 3 : 1;
                right = amount;
            } else if (ud.charAt(i) == 'D' && index == amount) {
                index = 1;
                lift = 1;
                right = Math.min(amount, 4);
            } else {
                index = ud.charAt(i) == 'U' ? index - 1 : index + 1;
                if (index < lift) {
                    lift = index;
                    right = amount > 4 ? lift + 3 : amount;
                } else if (index > right) {
                    right = index;
                    lift = amount > 4 ? right - 3 : 1;
                }
            }
        }
        for (int i = lift; i <= right; i++) {
            System.out.print(i + " ");
        }
        System.out.println();
        System.out.println(index);

    }

}


发表于 2022-08-10 14:00:47 回复(0)
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*;
public class Main {
    public static void main(String[] args) throws IOException {
        Scanner sc = new Scanner(System.in);
        while (sc.hasNext()) {
            int n = sc.nextInt();
            String op = sc.next();
            int[] music = new int[n + 1];
            int point = 1;//光标位置
            int begin = 1;//起始位置
            if(n<=4){//如果歌曲数目小于等于4直接按题目要求操作
                for(int i=0;i<op.length();i++){
                    if(op.charAt(i)=='U'){
                        if(point==1){
                            point=n;
                        }else{
                            point--;
                        }
                    }else if(op.charAt(i)=='D'){
                        if(point==n){
                            point=1;
                        }else{
                            point++;
                        }
                    }
                }
                for(int i=1;i<n;i++){
                    System.out.print(i+" ");
                }
                System.out.println(n);
                System.out.println(point);
            }else{
                for(int i=0;i<op.length();i++){
                if(op.charAt(i)=='U'){
                    if(point==1){
                        point=n;
                        begin=n-3;//当上移到最后一首起始位置改为n-3
                    }else{
                        point--;
                    }
                    if(point<begin){
                        begin--;//当小于起始位置表示该翻页了,按题目要求上移起始位置
                        //保证选中歌曲是当前页面第一首
                    }
                }else if(op.charAt(i)=='D'){
                    if(point==n){
                        point=1;
                        begin=point;//当下移到第一首时起始位置改为1
                    }else{
                        point++;
                    }
                    if(point>begin+3){
                        begin++;//当下移超过四首表示需要翻页了,按要求下移起始位置
                        //保证选中的歌曲是当前页面最后一首
                    }
                }
            }
                for (int i = begin; i < begin + 3; i++) {
                    System.out.print(i + " ");
                }
                System.out.println(begin + 3);
                System.out.println(point);
            }
            
        }

    }
}

发表于 2022-07-31 13:55:05 回复(0)
import java.io.*;
import java.util.*;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int num = sc.nextInt();
        String str = sc.next();
        int l1 = 1;
        int l2 = 1;
        char[] arr = str.toCharArray();
        for(char c : arr){
            if(c == 'U'){
                if(num <= 4){
                    if(l2 == 1){
                       l2 = num; 
                    } else {
                        l2--;
                    }
                } else {
                    if(l1 == 1){
                        if(l2 == 1){
                            l1 = num - 3;
                            l2 = 4;
                        } else {
                            l2--;
                        }
                    } else {
                        if(l2 == 1){
                            l1--;
                        } else {
                            l2--;
                        }
                    }
                }
            } else {
                if(num <= 4){
                    if(l2 == num){
                        l2 = 1;
                    } else {
                        l2++;
                    }
                } else {
                    if(l1 == num - 3){
                        if(l2 == 4){
                            l1 = 1;
                            l2 = 1;
                        } else {
                            l2++;
                        }
                    } else {
                        if(l2 == 4){
                            l1++;
                        } else {
                            l2++;
                        }
                    }
                }
            }
        }
        if(num <= 4){
            for(int i = 0;i < num;i++){
                System.out.print((l1 + i) + " ");
            }
            System.out.println("");
            System.out.println(l2);
        } else {
            for(int i = 0;i < 4;i++){
                System.out.print((l1 + i) + " ");
            }
            System.out.println("");
            System.out.println(l1 + l2 - 1);
        }
    }
}

发表于 2022-07-29 10:31:27 回复(0)

问题信息

难度:
52条回答 20791浏览

热门推荐

通过挑战的用户

查看代码