MP3光标位置_牛客题霸_牛客网
这题就是简单的根据它的规则把它的情况都列举出来即可(当然,我第一次写一脸懵逼,所以你现在一脸懵逼没事,看完你就觉得简单了。看完还懵逼,你就多看几遍,然后自己去尝试一下,只要你成功运行了,那你就觉得真的简单~)
这个光标移动,是要根据它的指令来的,玩过mp3都这个那个歌曲显示的效果,
由于屏幕一次只能显示4首歌曲,所以我们要分情况来讨论,歌曲小于等于4首的时候,跟歌曲数目大于4首的时候
咱们先说说歌曲小于等于4首的时候
假设只有4首歌好了,也就是一个数组,数组里面有4歌元素(1,2,3,4),光标的初始位置会是第一首歌,也就是此时光标指向1,我们要是往下Dowm的话,光标会往下移动到2,在Down再移动到3到4,假设现在光标到4了,你再继续Down的话,光标就会跳到1,也就是第一首歌,这个情况对你来说应该不陌生,我想你不了解的就是代码的实现,对吧?不要急,听完慢慢说~
一直Down的情况说完了,我们再说说Up的情况,假设现在光标在1位置,你要是Up一下,光标就跳到最后一首歌曲了,继续Up就会继续向上到3,到2,再到1,这个肯定不难理解是吧,因为现在歌曲数目 <= 4,所以不需要翻页,你在这个情况看屏幕,屏幕是不会变化的,操作的整个过程只是光标在移动~
上述就是歌曲数小于等于4的理解
下面咱们再说说歌曲数目大于4的情况,假设数目为10,歌曲就是1~10
刚开始,光标指向1对不
(1)然后你此时要是Up一下,光标就会跑到最后一首歌对吧,也就是会跑到10的位置,但是,因为这个情况是大于4首歌曲的,屏幕最多只能显示4首歌曲,这时候不仅光标变动,页面也会跟着跳转,在Up之前,你看到的页面是 1 2 3 4,你一Up,页面变成了 10 9 8 7, 然后光标现在指向10位置~
(2)假如现在光标在10位置,屏幕显示10 9 8 7 ,接着你Down一下,光标跳到了1,页面也跟着变化成1 2 3 4,这跟上面的(1)是两种特殊情况:光标在第一首,显示第一页,但是要Up;
光标在最后一首,显示最后一页,但是要Down
(3)假设现在你的光标指向4对吧,此时页面显示是1 2 3 4,你要往下Dowm,那么光标就会跳到5,然后页面的第一行网上顶一行,把1顶掉,把5显示出来~这个你看手机的时候肯定知道的
(4)同上,假设现在光标指向2,页面显示的是 2 3 4 5,然后你一Up,光标跳到1,然后页面会网下顶一行,把上面的1显示出来
你会发现(3)和(4)的情况是:此时光标位置的在第一行,但你要Up;光标位置在第4行,但你要Down(排除了(1)和(2)的情况,互不相干)
(5)排除了上述的情况后就剩下简单的了:光标现在在页面的中间两首歌的其中一种,不管你是Up还是Dowm,只是光标移动,页面不会变化~
下面是代码展示
import java.util.*;
public class Main {
public static void main(String[] args){
Scanner in = new Scanner(System.in);
int n = in.nextInt();
String cmd = in.next();
move(n,cmd);
}
public static void move(int n, String cmd){
if(n <= 4){
int[] arr = new int[n];
int mouse = 1;
for(int i = 0; i < arr.length; i++){
arr[i] = i + 1;
}
for(int i = 0; i < cmd.length(); i++){
if(mouse == 1 && cmd.charAt(i) == 'U'){
mouse = arr[arr.length-1];
}else if(mouse == arr.length && cmd.charAt(i) == 'D'){
mouse = 1;
}else if(cmd.charAt(i) == 'U'){
mouse--;
}else {
mouse++;
}
}
for(int x : arr){
System.out.print(x + " ");
}
System.out.println();
System.out.println(mouse);
}else if(n > 4){
int[] arr = new int[n];
int mouse = 1;//光标此时位置
int first = 1;//页面的显示
for(int i = 0; i < arr.length; i++){
arr[i] = i + 1;
}
//开始遍历cmd
for(int i =0; i < cmd.length(); i++){
//此时位于第一页,第一首歌,并且要UP
if(first == 1 && mouse == 1 && cmd.charAt(i) == 'U'){
first = n - 3;
mouse = arr[n - 1];
}else if(first == n - 3 && mouse == arr[n - 1] && cmd.charAt(i) == 'D'){
//此时这里表示,位于最后一页,最后一首歌,并且要Down
first = 1;
mouse = 1;
}else if(first != 1 && mouse == first && cmd.charAt(i) == 'U'){
//这里表示不是第一页,但第一首歌,并且要UP
first--;
mouse--;
}else if(first != n - 3 && mouse == first + 3 && cmd.charAt(i) == 'D'){
//这里表示不是最后一页,但最后一首歌,并且要Down
first++;
mouse++;
}else if(cmd.charAt(i) == 'U'){
//这里表示在页面中间的其中一首歌
mouse--;
}else if(cmd.charAt(i) == 'D'){
mouse++;
}
}
//遍历完cmd后打印此时的状态
for(int i = 0; i < 4; i++){
System.out.print(arr[first - 1 + i] + " ");
}
System.out.println();
System.out.println(mouse);
}
}
}
我们去遍历命令行cmd,根据歌曲数目分为两种情况,然后在根据命令行去执行光标移动和页面变化,当命令行遍历完后,就要打印出此时的页面,和光标指向的位置