题解 | #MP3光标位置#

MP3光标位置

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

针对题目描述,实际上就是要维护一个滑动窗口,大小为Math.min(songs, 4);

忽略0位置,从1到n方便计数,start = 1, end = Math.min(songs, 4),cur保存当前位置;

每次根据操作为U则加一,反之减一,会出现两种情况,超过窗口或没超过,通过!(start <= cur && cur <= end)判断;

针对U操作来分析,如果cur不越过位置1,那么每次向上挪动时,窗口左边界start变成cur,右边界变为左边界+窗口大小-1;

如果越过1,观察发现右边界变成cur的位置,而左边界变成了右边界-窗口大小+1;

因为每次取余,会出现特殊情况,cur为1向上挪动时变成0,cur为n-1向下挪动变成n,前者被特殊处理了,而后者则需要加个判断,不然会跳出窗口出现值为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.hasNextInt()) { // 注意 while 处理多个 case
            int songs = in.nextInt();
            String oper = in.next();
            int start  = 1, end = Math.min(songs, 4), cur = 1;
            int window = Math.min(songs, 4) -1;
            for (int i = 1; i <= oper.length(); i++) {
                if (oper.charAt(i - 1) == 'U') {
                    cur = cur - 1;
                    if (!(start <= cur && cur <= end)) {
                        if (start == 1) {
                            cur = songs;
                            end = cur;
                            start = end - window;
                        } else {
                            cur = cur % songs;
                            start = cur;
                            end = start + window;
                        }
                    }
                } else {
                    cur = cur + 1;
                    if (!(start <= cur && cur <= end)) {
                        if (end == songs) {
                            cur = 1;
                            start = cur;
                            end = start + window;
                        } else {
                            cur = cur == songs ? songs : cur % songs;
                            end = cur;
                            start = end - window;
                        }
                    }
                }
            }
            StringBuilder sb = new StringBuilder();
            while (start <= end) {
                sb.append(start + " ");
                start++;
            }
            System.out.println(sb.toString());
            System.out.println(cur);
        }
    }
}

全部评论

相关推荐

不愿透露姓名的神秘牛友
11-26 18:54
说等下个版本吧的发呆爱好者很贪睡:佬最后去了哪家呀
点赞 评论 收藏
分享
有趣的牛油果开挂了:最近这个阶段收到些杂七杂八的短信是真的烦
点赞 评论 收藏
分享
沉淀一会:1.同学你面试评价不错,概率很大,请耐心等待; 2.你的排名比较靠前,不要担心,耐心等待; 3.问题不大,正在审批,不要着急签其他公司,等等我们! 4.预计9月中下旬,安心过节; 5.下周会有结果,请耐心等待下; 6.可能国庆节前后,一有结果我马上通知你; 7.预计10月中旬,再坚持一下; 8.正在走流程,就这两天了; 9.同学,结果我也不知道,你如果查到了也告诉我一声; 10.同学你出线不明朗,建议签其他公司保底! 11.同学你找了哪些公司,我也在找工作。
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务