題目描述
MP3 Player由於屏幕較小,顯示歌曲列表的時候每屏只能顯示幾首歌曲,用戶要經過上下鍵才能瀏覽全部的歌曲。
爲了簡化處理,假設每屏只能顯示4首歌曲,光標初始的位置爲第1首歌。
如今要實現經過上下鍵控制光標移動來瀏覽歌曲列表,控制邏輯以下:
歌曲總數<=4的時候,不須要翻頁,只是挪動光標位置。
光標在第一首歌曲上時,按Up鍵光標挪到最後一首歌曲;光標在最後一首歌曲時,按Down鍵光標挪到第一首歌曲。
-> 1 1
2 ---UP--> 2
3 3
4 -> 4
其餘狀況下用戶按Up鍵,光標挪到上一首歌曲;用戶按Down鍵,光標挪到下一首歌曲。
1 1
2 ---UP-->-> 2
-> 3 3
4 4
2. 歌曲總數大於4的時候(以一共有10首歌爲例):
特殊翻頁:屏幕顯示的是第一頁(即顯示第1 – 4首)時,光標在第一首歌曲上,用戶按Up鍵後,屏幕要顯示最後
一頁(即顯示第7-10首歌),同時光標放到最後一首歌上。一樣的,屏幕顯示最後一頁時,光標在最後一首歌曲上,
用戶按Down鍵,屏幕要顯示第一頁,光標挪到第一首歌上。
-> 1 7
2 ---UP--> 8
3 9
4 -> 10
通常翻頁:屏幕顯示的不是第一頁時,光標在當前屏幕顯示的第一首歌曲時,用戶按Up鍵後,屏幕從當前歌曲的上
一首開始顯示,光標也挪到上一首歌曲。光標當前屏幕的最後一首歌時的Down鍵處理也相似。
-> 4 -> 3
5 ---UP--> 4
6 5
7 6
其餘狀況,不用翻頁,只是挪動光標就行。
輸入描述
輸入說明:
1 輸入歌曲數量
2 輸入命令 U或者D
輸出描述
輸出說明
1 輸出當前列表
2 輸出當前選中歌曲
輸入例子
10
UUUU
輸出例子
7 8 9 10
7
算法實現
import java.util.Scanner;
/**
* Declaration: All Rights Reserved !!!
*/
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
// Scanner scanner = new Scanner(Main.class.getClassLoader().getResourceAsStream("data.txt"));
while (scanner.hasNext()) {
int num = scanner.nextInt();
String command = scanner.next();
// System.out.println(num + " " + command);
System.out.println(locatePointer(num, command));
}
scanner.close();
}
private static String locatePointer(int num, String command) {
if (num < 5) {
return lessThan5(num, command);
} else {
return greatThan4(num, command);
}
}
/**
* 求光標的位置,歌曲數大於4
*
* @param num 總共的歌曲數目
* @param command 命令
* @return 當前選中歌曲
*/
private static String greatThan4(int num, String command) {
int curr = 1;
// 屏幕能夠顯示的第一個光標
int top = 1;
// 屏幕能夠顯示的最後一個光標
int bot = 4;
StringBuilder builder = new StringBuilder(command.length() * 2);
for (int i = 0; i < command.length(); i++) {
char c = command.charAt(i);
// 若是是向上的
if (c == 'U') {
curr--;
// 若是翻到第一首歌的上面
if (curr < 1) {
curr = num;
// 更新窗口能夠顯示的範圍
bot = num;
top = num - 3;
}
// 非第一首歌上面
else {
// 已經超過顯示的範圍
if (curr < top) {
top = curr;
bot = curr + 3;
}
}
} else if (c == 'D') {
curr++;
// 若是翻到最後一首歌的下面了
if (curr > num) {
curr = 1;
// 更新窗口能夠顯示的範圍
bot = 4;
top = 1;
}
// 不是最後一首歌
else {
// 已經超過顯示的範圍
if (curr > bot) {
bot = curr;
top = curr - 3;
}
}
}
// 若是是最後一個命令,記錄頁面顯示的範圍和光標的位置
if (i == command.length() - 1) {
for (int j = top; j <= bot; j++) {
// 計錄光標的範圍
builder.append(j).append(' ');
}
builder.setCharAt(builder.length() - 1, '\n');
// 計錄光標的位置
builder.append(curr).append('\n');
}
}
return builder.substring(0, builder.length() - 1);
}
/**
* 求光標的位置,歌曲數小於5
*
* @param num 總共的歌曲數目
* @param command 命令
* @return 當前選中歌曲
*/
private static String lessThan5(int num, String command) {
StringBuilder builder = new StringBuilder(command.length() * 2);
// 當前光標的位置,以0計
int curr = 0;
for (int i = 0; i < command.length(); i++) {
char c = command.charAt(i);
if (c == 'U') {
curr = (curr - 1 + num) % num;
} else if (c == 'D') {
curr = (curr + 1 + num) % num;
}
// 若是是最後一個命令,記錄頁面顯示的範圍和光標的位置
if (i == command.length() - 1) {
for (int j = 1; j <= num; j++) {
// 計錄光標的範圍
builder.append(j).append(' ');
}
builder.setCharAt(builder.length() - 1, '\n');
// 計錄光標的位置
builder.append(curr + 1).append('\n');
}
}
return builder.substring(0, builder.length() - 1);
}
}