網易遊戲開發軟體筆試題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),遇到換行符則結束輸入並輸出