题解 | #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-29 12:19
点赞 评论 收藏
分享
ArisRobert:统一解释一下,第4点的意思是,公司按需通知员工,没被通知到的员工是没法去上班的,所以只要没被通知到,就自动离职。就是一种比较抽象的裁员。
点赞 评论 收藏
分享
totoroyyw:千年老妖😂
投递华为等公司10个岗位
点赞 评论 收藏
分享
评论
1
收藏
分享
牛客网
牛客企业服务