1. 程式人生 > >網易遊戲開發軟體筆試題1

網易遊戲開發軟體筆試題1

有一天,他在遊戲中獲得了一串數字,直覺告訴他這不是一串普通的數字串,或許可以破解一些關於網易的祕密。破解的第一步,他很想知道,在這串數字中,最多可以挑出多少個’9706’串。挑選的規則為:

(1)挑出的數字’9’,’7’,’0’,’6’在原串中可以不連續,但是數字的先後順序不能改變

(2)使用過的數字不能被再次使用

如’123901370997606’可以最多挑出2個’9706’,而’6079’則無法挑出任何一個’9706’。

輸入

第一行是整數T(T <= 100),表示下面有T組資料。

之後T行,每行為一組資料,每組資料為一個字串。每個字串的長度L <= 50000。每個字串只會包含數字[‘0’…’9’]。

輸出

輸出T行,每行對應一個數據的輸出結果,表示字串最多能挑出多少個’9706’。
樣例輸入4
6097
97069706
997776600069
123901370997606
樣例輸出
0
2
1
2

答案

#include<iostream>
#include<vector>
using namespace std;


void main()
{   
    int lines;
    char* data=new char[50000];    //字串不能超過50000
    vector<int> out;
    cin >> lines;      //cin >> lines或者getline(cin,lines)遇到換行符則結束輸入並輸出結果
getchar(); //此處使用getchar()主要是因為int佔兩個位元組,而getchar()每次只能讀取一個字元,即一個位元組。呼叫一次getchar()向後移動一個位元組,因此能保證進入下面while迴圈時已經取走了‘\n’而等待輸入;若是不加這句,則下面的while迴圈要多執行一次才能執行等待使用者的輸入。 while (lines-- > 0) { int cnt = 0; int number[4] = { 0 }; while ((data[0] = getchar()) != '\n') //每呼叫一次getchar()則向後讀取一個字元
{ if (data[0] == '9') ++number[0]; if (data[0] == '7'&&number[0]>number[1]) ++number[1]; if (data[0] == '0'&&number[1]>number[2]) ++number[2]; if (data[0] == '6'&&number[2] > number[3]) ++number[3]; //++cnt; } out.push_back(number[3]); } for (auto temp : out) cout << temp << endl; system("pause"); }

這塊主要考察的是對單個字元提取判別,使用getchar().
getchar有一個int型的返回值.當程式呼叫getchar時.程式就等著使用者按鍵.使用者輸入的字元被存放在鍵盤緩衝區中.直到使用者按回車為止(回車字元也放在緩衝區中).當用戶鍵入回車之後,getchar才開始從stdio流中每次讀入一個字元.getchar函式的返回值是使用者輸入的字元的ASCII碼,如出錯返回-1,且將使用者輸入的字元回顯到螢幕.如使用者在按回車之前輸入了不止一個字元,其他字元會保留在鍵盤快取區中,等待後續getchar呼叫讀取.也就是說,後續的getchar呼叫不會等待使用者按鍵,而直接讀取緩衝區中的字元,直到緩衝區中的字元讀完為後,才等待使用者按鍵.

cin>>lines或者getline(cin,lines),遇到換行符則結束輸入並輸出