MP3光標位置

題目描述

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);
    }
}
相關文章
相關標籤/搜索