题解 | #MP3光标位置#
MP3光标位置
http://www.nowcoder.com/practice/eaf5b886bd6645dd9cfb5406f3753e15
import java.util.*;
public class Main{
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
while(sc.hasNext()){
//歌曲数量
int n = sc.nextInt();
//命令
String ord = sc.next();
select(n, ord);
}
}
public static void select(int n, String order){
/**分情况讨论
1.歌曲数量小于等于4:显示的列表不改变(只有四种情况)
1.光标在第一首歌,且Up键,则挪动到最后一首歌:i=0, o=U, --> i=n-1
2.光标在最后一首歌曲,且Down键,则挪到第一首歌曲: i=n-1, o=D, --> i=0
3.其他情况Up键,则挪到上一首歌曲: i>0,o=U, i=i-1
4.其他情况Down键,则挪到下一首歌曲: i<n-1, o=D, i=i+1
2.歌曲数量大于4,列表会改变(有6种情况,需要一个用于记录显示窗口起点的变量 k)
1.光标在第一首歌,且Up键,则挪动到最后一首歌:i=0, o=U, --> i=n-1, k=i-4
2.光标在最后一首歌曲,且Down键,则挪到第一首歌曲: i=n-1, o=D, --> i=0, k=0
3.屏幕显示的不是第一页,光标在当前屏幕显示的第一首歌曲, 且Up键,
屏幕从当前歌曲的上一首开始显示,光标也挪到上一首歌曲, i=k>4,o=U i=k -= 1;
4.光标在当前屏幕的最后一首歌,且Down键:i=k+4-1,o=D, i=k+=1,
5.其他情况Up键,则挪到上一首歌曲: i>0 && i>k,o=U,, i=i-1
6.其他情况Down键,则挪到下一首歌曲: i<n-1 && i>k, o=D, i=i+1
*/
//存储
ArrayList<Integer> player = new ArrayList();
for(int i=0; i<n; i++){
player.add(i+1);
}
int win = 4;
//光标 和 遍历命令的变量 count
int i = 0;
int count = 0;
if(n<=win){
while(count<order.length()){
//四种情况
if(i==0 && order.charAt(count)=='U'){
i = n-1;
}else if(i==n-1 && order.charAt(count)=='D'){
i = 0;
}else if(i>0 && order.charAt(count)=='U'){
i --;
}else if(i<n-1 && order.charAt(count)=='D'){
i ++;
}
count ++;
}
//输出结果
int cur = -1;
for(int m=0; m<n; m++){
if(m==i) cur = player.get(m);
System.out.print(player.get(m) + " ");
}
System.out.println();
System.out.println(cur);
}else{
//记录显示窗口的起始位置
int k = 0;
while(count<order.length()){
//六种情况
if(order.charAt(count)=='U'){
//光标在第一位
if(i==0){
i = n-1;
k = n-win;
}else{
i -= 1;
//翻页情况:光标位置超出窗口起始位置
if(i<k){
k -= 1;
}
}
}
if(order.charAt(count)=='D'){
//光标在最后一位
if(i==n-1){
i = 0;
k = 0;
}else{
i += 1;
//翻页情况:光标位置超出窗口起始位置
if(i>k+win-1){
k += 1;
}
}
}
count ++;
}
//输出结果
int cur = -1;
for(int m=k; m<k+win; m++){
if(m==i) cur = player.get(m);
System.out.print(player.get(m) + " ");
}
System.out.println();
System.out.println(cur);
}
}
}