题解 | #MP3光标位置#

MP3光标位置

https://www.nowcoder.com/practice/eaf5b886bd6645dd9cfb5406f3753e15

穷举法,当歌曲数小于4时,不用翻页,有两种特殊情况:1、光标在第一首歌,2、光标在第二首歌,记住光标位置就可以了;当歌曲数大于4时,有四种特殊情况:1、光标在第一首歌 2、光标在第二首歌 3、光标在页的第一首歌,且不在第一页 4、光表在页面的最后一首歌,且页数不在最后一页
代码如下:
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 a = in.nextInt();
            String str = in.next().toUpperCase();
            turnPages(a, str);
        }
    }

    private static void turnPages(int a, String str) {
        //光标,指向第几首歌
        int signal = 1;
        //当歌曲书小于4首时
        if (a <= 4) {
            for (int i = 0; i < str.length(); i++) {
                //光标在第一首时,向上操作
                if (str.charAt(i) == 'U' && signal == 1) {
                    signal = a;
                    //光标在最后一首时,向下操作
                } else if (str.charAt(i) == 'D' && signal == a) {
                    signal = 1;
                    //向上操作
                } else if (str.charAt(i) == 'U') {
                    signal--;
                    //向下操作
                } else {
                    signal++;
                }
            }
            for (int i = 0; i < a; i++) {
                System.out.print(i + 1 + " ");
            }
            System.out.println("\n" + signal);
            return;
        }
        //歌曲大于4时
        // int[] currentPageList = new int[4];
        // currentPageList[0] = 1;
        int first = 1;
        for (int i = 0; i < str.length(); i++) {
            //光标在第一首时,向上操作
            if (str.charAt(i) == 'U' && signal == 1) {
                signal = a;
                first = a - 3;
                //光标在最后一首时,向下操作
            } else if (str.charAt(i) == 'D' && signal == a) {
                signal = 1;
                first = 1;
                //向上操作,且光标在页面第一首歌时
            } else if (str.charAt(i) == 'U' && signal == first) {
                signal--;
                first = signal;
                //向下操作,且光标在页面最后一首歌时
            } else if (str.charAt(i) == 'D' && signal == first + 3) {
                signal++;
                first++;
                //向上操作
            } else if (str.charAt(i) == 'U') {
                signal--;
                //向下操作
            } else {
                signal++;
            }
        }
        for (int i = 0; i < 4; i++) {
            System.out.print(first + i + " ");
        }
        // System.out.print("" + first + ' ' + (first + 1) + ' ' + (first + 2) + ' ' +
        //                  (first + 3) + "\n");
        System.out.println("\n" + signal);

    }
}

复杂度分析

时间复杂度O(n), 其中n为命令字符串的长度,需要遍历n个命令。

空间复杂度O(1), 直接判断,无额外空间。



全部评论

相关推荐

11-15 17:19
湖南大学 Java
成果成果成果果:这是哪个公司的hr,这么离谱吗,我没见过用性别卡技术岗的,身边女性同学拿大厂offer的比比皆是
点赞 评论 收藏
分享
点赞 评论 收藏
分享
评论
1
收藏
分享
牛客网
牛客企业服务