時間是兩個小時,總共三道編程題目。
第一道題目大意:
輸入一個int類型的數,判斷它的比特流中有多少個“010”,及第一個“101”的下標(這個下標是從低位向高位數的)。
如:輸入:21
輸出 2 0
原因:21 二進制表示為 0000 0000 0000 0000 0000 0000 0001 0101
總共兩個“101”(兩個“101”可以重疊), 且第一個下標為0,第二個下標為2,所以返回2 0
提交代碼如下

1 int main(){ 2 int num; 3 while(cin >> num){ 4 int tag = 5, tag1 = 2;// 分別是101 和 010 5 int times = 0, numcnt = 30, firstindex = -1; 6 while(numcnt --){ 7 if((num & tag) == tag && (num & tag1) == 0){ 8 times ++; 9 if(firstindex == -1) 10 firstindex = 29 - numcnt; 11 } 12 tag <<= 1; 13 tag1 <<= 1; 14 } 15 cout << times << " " << firstindex << endl; 16 } 17 return 0; 18 }
第二道題目大意:
背景:數據庫一條記錄(包括多個字段:數值,字符串)合並成一個字符串作為輸入,現在的任務是將不同的字段分類開來,輸出字段的數目和每個字段的內容。
輸入一行字符串,將其分割成多段,輸入的字符串應滿足的條件:
- 輸入的字符串沒有空格
- 不同的字段之間以逗號分隔
- 如果一個字段內有逗號(“,”)或者引號(“"”),則該字段首尾會加上引號(“"”),且字段內的引號寫作""(兩個引號)
若輸入的字符串有問題,則輸出ERROR;
否則,輸出字段個數,然后輸出每個字段 (各占一行)
我的思路是:因為每個字段引號都是成對的,所以遇見逗號的時候判斷此時引號是否成對。若不成對,說明該逗號是字段內部的逗號;反之,該逗號為兩字段的分隔號。
提交代碼如下:

1 int main(){ 2 int num; 3 string inStr; 4 while(getline(cin,inStr)){ 5 if(inStr.size() == 0){ 6 cout << 0 << endl; 7 continue; 8 } 9 int lastIndex = -1; 10 stack<char> charStack; 11 vector<string> strVec; 12 for(int i = 0; i < inStr.size(); ++ i){ 13 if(inStr[i] == '"'){ 14 charStack.empty() ? charStack.push('"') : charStack.pop(); 15 } 16 if(inStr[i] == ',' && charStack.empty()){ 17 strVec.push_back(inStr.substr(lastIndex+1, i-lastIndex-1)); 18 lastIndex = i; 19 } 20 } 21 if(!charStack.empty()){ 22 cout << "ERROR" <<endl; 23 continue; 24 } 25 strVec.push_back(inStr.substr(lastIndex+1, inStr.size()-lastIndex-1)); 26 cout << strVec.size() << endl; 27 for(int i = 0; i < strVec.size(); ++ i){ 28 if(strVec[i].size() == 0 || (strVec[i].size() == 2 && strVec[i][0] == '"' && strVec[i][1] == '"')) 29 cout << "--" <<endl; 30 else if(strVec[i][0] == '"'){ 31 bool flag = false; 32 for(auto it = strVec[i].begin()+1; it != strVec[i].end(); ++ it){ 33 if(*it == '"'){ 34 if(flag){ 35 printf("\""); 36 flag = false; 37 } 38 else 39 flag = true; 40 } 41 else 42 printf("%c", *it); 43 } 44 printf("\n"); 45 } 46 else 47 cout << strVec[i] << endl; 48 } 49 } 50 return 0; 51 }
第三道題目大意:
背景:好友推薦功能,A和B是好友,B和C是好友,A和C不是好友,則C是A的2度好友;A和B的熟悉度為m,B和C的熟悉度為n,則A和C的推薦度為m+n;
輸入:測試用例個數T;
然后輸入每個測試用例:用戶數m,某個特定用戶的id,要求的好友度數t,已知的好友數目n
接下來輸入n行,每行的內容為:用戶1的id 用戶2的id 兩用戶的熟悉度
輸出:先輸出特定用戶的t度好友個數,沒有則輸出-1;若有,接下來一次輸出用戶id,按照推薦度從高到低(若推薦度相同,按照id從小到大)
當時的思路是:dijkstra算法找到特定用戶t度好友,然后進行排序輸出。(但是印象中題目在有兩個距離相同的路徑時,推薦度采用最高那個還是第一個沒有說清楚,也可能是我沒理解清楚題意。當時我是注釋了部分代碼又提交了一下。)
當時提交過了40%,提交代碼如下:

int T, userCnt, userId, friendVal, pairCnt; int dist[50]; int friendValSum[50]; int routeMatrix[50][50]; int valMatrix[50][50]; void dijkstra(int root){ memset(dist, 0x7f, sizeof(dist)); memset(friendValSum, 0, sizeof(friendValSum)); for(int i = 0; i < userCnt; ++ i) dist[i] = routeMatrix[root][i]; for(int i = 0; i < userCnt; ++ i) friendValSum[i] = valMatrix[root][i]; dist[root] = 0; vector<bool> flagVec(50,false); flagVec[root] = true; for(int j = 1; j < userCnt; ++ j){ int minDis = INF, v = -1; for(int i = 0; i < userCnt; ++i){ if(!flagVec[i] && dist[i] < minDis){ minDis = dist[i]; v = i; } } if(v == -1 || minDis > friendVal) return; flagVec[v] = true; for(int i = 0; i < userCnt; ++ i){ if(!flagVec[i] && routeMatrix[v][i] + dist[v] < dist[i]){ dist[i] = routeMatrix[v][i] + dist[v]; friendValSum[i] = valMatrix[v][i] + friendValSum[v]; } /*else if(!flagVec[i] && routeMatrix[v][i] + dist[v] == dist[i] && valMatrix[v][i] + friendValSum[v] > friendValSum[i]){ friendValSum[i] = valMatrix[v][i] + friendValSum[v]; }*/ } } } typedef struct NODE{ int id, val; NODE(int d, int v):id(d),val(v){} }node; bool cmp(node a, node b){ if(a.val != b.val) return a.val > b.val; else return a.id < b.id; } int main(){ int tmpSt, tmpEnd, tmpVal; cin >> T; while(T--){ cin >> userCnt >> userId >> friendVal; cin >> pairCnt; memset(routeMatrix, 0x7f, sizeof(routeMatrix)); memset(valMatrix, 0x7f, sizeof(valMatrix)); for(int i = 0; i < pairCnt; ++ i){ scanf("%d %d %d", &tmpSt, &tmpEnd, &tmpVal); routeMatrix[tmpSt][tmpEnd] = 1; routeMatrix[tmpEnd][tmpSt] = 1; valMatrix[tmpSt][tmpEnd] = tmpVal; valMatrix[tmpEnd][tmpSt] = tmpVal; } dijkstra(userId); //if(friendVal == 0){ // cout << "-1" << endl; // continue; //} vector<node> nodeVec; for(int i = 0; i < userCnt; ++ i){ if(dist[i] == friendVal){ nodeVec.push_back(NODE(i, friendValSum[i])); } } if(nodeVec.size() == 0) cout << "-1" << endl; else{ sort(nodeVec.begin(), nodeVec.end(), cmp); bool flag = false; for(int i = 0; i < nodeVec.size(); ++i){ flag ? printf(" ") :flag = true; printf("%d", nodeVec[i].id); } } printf("\n"); } return 0; }