2017网易有道内推编程题
一、[編程題] 洗牌
洗牌在生活中十分常見,現在需要寫一個程序模擬洗牌的過程。 現在需要洗2n張牌,從上到下依次是第1張,第2張,第3張一直到第2n張。首先,我們把這2n張牌分成兩堆,左手拿著第1張到第n張(上半堆),右手拿著第n+1張到第2n張(下半堆)。接著就開始洗牌的過程,先放下右手的最后一張牌,再放下左手的最后一張牌,接著放下右手的倒數第二張牌,再放下左手的倒數第二張牌,直到最后放下左手的第一張牌。接著把牌合并起來就可以了。 例如有6張牌,最開始牌的序列是1,2,3,4,5,6。首先分成兩組,左手拿著1,2,3;右手拿著4,5,6。在洗牌過程中按順序放下了6,3,5,2,4,1。把這六張牌再次合成一組牌之后,我們按照從上往下的順序看這組牌,就變成了序列1,4,2,5,3,6。 現在給出一個原始牌組,請輸出這副牌洗牌k次之后從上往下的序列。
輸入描述:
第一行一個數T(T ≤ 100),表示數據組數。對于每組數據,第一行兩個數n,k(1 ≤ n,k ≤ 100),接下來一行有2n個數a1,a2,...,a2n(1 ≤ ai ≤ 1000000000)。表示原始牌組從上到下的序列。
輸出描述:
對于每組數據,輸出一行,最終的序列。數字之間用空格隔開,不要在行末輸出多余的空格。
輸入例子:
3
3 1
1 2 3 4 5 6
3 2
1 2 3 4 5 6
2 2
1 1 1 1
輸出例子:
1 4 2 5 3 6
1 5 4 3 2 6
1 1 1 1
分析:每次洗牌后均是是將序號為1-n的元素依次排在新的序列的奇數位,序列為n+1-2*n的元素依次排在新的序列的偶數位
測試代碼如下:
#include<iostream> #include<vector> using namespace std; int main() {int T;cin >> T;for (int i = 0; i < T; i++){int n, k;cin >> n >> k;int len = n + n;vector<long> array;for (int i = 0; i <= 2 * n; i++)array.push_back(0);for (int j = 1; j <=len; j++){cin>>array[j];}for (int j = 0; j < k; j++){int count = 0;vector<long> tmpArray=array;for (int i = 1; i <=n; i++){count++;tmpArray[count++] = array[i];tmpArray[count] = array[n + i];}array = tmpArray;}cout << array[1];for (int i = 2; i <= len; i++)cout << " " << array[i];cout << endl;}return 0; }測試結果:
二、[編程題]構造隊列
小明同學把1到n這n個數字按照一定的順序放入了一個隊列Q中。現在他對隊列Q執行了如下程序:
while(!Q.empty())????????????? //隊列不空,執行循環
{
??? int x=Q.front();??????????? //取出當前隊頭的值x
??? Q.pop();???????????????? //彈出當前隊頭
??? Q.push(x);?????????????? //把x放入隊尾
??? x = Q.front();????????????? //取出這時候隊頭的值
??? printf("%d\n",x);????????? //輸出x
?? ?Q.pop();???????????????? //彈出這時候的隊頭
}
做取出隊頭的值操作的時候,并不彈出當前隊頭。
小明同學發現,這段程序恰好按順序輸出了1,2,3,...,n。現在小明想讓你構造出原始的隊列,你能做到嗎?[注:原題樣例第三行5有錯,應該為3,以下已修正]
輸入描述:
第一行一個整數T(T ≤ 100)表示數據組數,每組數據輸入一個數n(1 ≤ n ≤ 100000),輸入的所有n之和不超過200000。
輸出描述:
對于每組數據,輸出一行,表示原始的隊列。數字之間用一個空格隔開,不要在行末輸出多余的空格.
輸入例子:
4
1
2
3
10
輸出例子:
1
2 1
2 1 3
?
8 1 6 2 10 3 7 4 9 5
分析:做這道題的時候,看一眼覺得太難,都意思都不太理解。現在靜下來仔細想想,這道題是這個意思:
輸入一個數n,則這個執行這個隊列后輸出1,2,3,4…n,現在要還原出原始的隊列(即1-n構成,但是順序不是這樣的) ?例如輸入3,原始隊列是2,1,3時,才能使得最后輸出的是1,2,3
首先在隊列中依次加入1,2,...n,代表題目描述中A序列的下標,然后模擬題目描述的過程,可以知道第1個會輸出2,這就代表著B序列中下標1的元素恰好是A序列中下標2的元素,而我們知道B序列下標1的元素就是“1”,也就是說A序列中下標2的元素是“1”,另開辟一個數組,在數組第2位存下1,再繼續模擬,重復以上過程,則這個數組中的元素順序就是答案要的
測試代碼:
#include<iostream> #include<queue> using namespace std; int main() {queue<int> Q;int k, n;int num[10001];cin >> k;while (k-->0){cin >> n;for (int i = 1; i <= n; ++i)Q.push(i);int cnt = 1;while (!Q.empty()){int x = Q.front();Q.pop();Q.push(x);num[Q.front()] = cnt++;Q.pop();}for (int i = 1; i<n; i++)cout << num[i] << " ";cout << num[n] << endl;} }測試結果如下:
?
?
?
轉載于:https://www.cnblogs.com/lxt1105/p/6684756.html
總結
以上是生活随笔為你收集整理的2017网易有道内推编程题的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 《Spring实战》读书笔记--Spri
- 下一篇: python简易木马(一)