1. 程式人生 > >MP3游標位置/華為機試(C/C++)

MP3游標位置/華為機試(C/C++)

題目描述

MP3 Player因為螢幕較小,顯示歌曲列表的時候每屏只能顯示幾首歌曲,使用者要通過上下鍵才能瀏覽所有的歌曲。為了簡化處理,假設每屏只能顯示4首歌曲,游標初始的位置為第1首歌。

現在要實現通過上下鍵控制游標移動來瀏覽歌曲列表,控制邏輯如下:

  1. 歌曲總數<=4的時候,不需要翻頁,只是挪動游標位置。

游標在第一首歌曲上時,按Up鍵游標挪到最後一首歌曲;游標在最後一首歌曲時,按Down鍵游標挪到第一首歌曲。

其他情況下使用者按Up鍵,游標挪到上一首歌曲;使用者按Down鍵,游標挪到下一首歌曲。

  2. 歌曲總數大於4的時候(以一共有10首歌為例):

特殊翻頁:螢幕顯示的是第一頁(即顯示第1 – 4首)時,游標在第一首歌曲上,使用者按Up鍵後,螢幕要顯示最後一頁(即顯示第7-10首歌),同時游標放到最後一首歌上。同樣的,螢幕顯示最後一頁時,游標在最後一首歌曲上,使用者按Down鍵,螢幕要顯示第一頁,游標挪到第一首歌上。

一般翻頁:螢幕顯示的不是第一頁時,游標在當前螢幕顯示的第一首歌曲時,使用者按Up鍵後,螢幕從當前歌曲的上一首開始顯示,游標也挪到上一首歌曲。游標當前螢幕的最後一首歌時的Down鍵處理也類似。

其他情況,不用翻頁,只是挪動游標就行。

輸入描述:

輸入說明: 1 輸入歌曲數量 2 輸入命令 U或者D

輸出描述:

輸出說明 1 輸出當前列表 2 輸出當前選中歌曲

示例1

輸入

10
UUUU

輸出

7 8 9 10
7

程式碼:

//第六十二題  MP3游標位置
#include<iostream>
#include<string>
using namespace std;
void Short(string str, int  n)
{
	int initial = 1, current = 1;
	int len = str.length();
	for (int i = 0; i < len; i++)
	{
		if (str[i] == 'U')
		{
			if (current == 1)
				current = n;
			else
				current--;
		}
		else if (str[i] == 'D')
		{
			if (current == n)
				current = 1;
			else
				current++;
		}
	}
	for (int i = 1; i < n; i++)
		cout << i << " ";
	cout << n << endl;
	cout << current << endl;
}

void Long(string str, int n)
{
	int initial = 1, current = 1;
	int len = str.length();
	for (int i = 0; i < len; i++)
	{
		if (str[i] == 'U')
		{
			if (initial == 1 && current == 1)
			{
				current = n;
				initial = n - 3;
			}
			else if (initial == current)
			{
				current--;
				initial--;
			}
			else
				current--;
		}
		else if (str[i] == 'D')
		{
			if (initial == n - 3 && current == n)
			{
				current = 1;
				initial = 1;
			}
			else if (initial == current - 3)
			{
				current++;
				initial++;
			}
			else
				current++;
		}
	}
	for (int i = initial; i != initial + 3; i++)
		cout << i << " ";
	cout << initial + 3 << endl;
	cout << current << endl;
}

int main()
{
	int n;
	while (cin >> n)
	{
		string str;
		cin >> str;
		if (n <= 4)
			Short(str, n);
		else
			Long(str, n);
	}
	return 0;
}