时间是两个小时,总共三道编程题目。
第一道题目大意:
输入一个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 }
View Code
第二道题目大意:
背景:数据库一条记录(包括多个字段:数值,字符串)合并成一个字符串作为输入,现在的任务是将不同的字段分类开来,输出字段的数目和每个字段的内容。
输入一行字符串,将其分割成多段,输入的字符串应满足的条件:
- 输入的字符串没有空格
- 不同的字段之间以逗号分隔
- 如果一个字段内有逗号(“,”)或者引号(“"”),则该字段首尾会加上引号(“"”),且字段内的引号写作""(两个引号)
若输入的字符串有问题,则输出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 }
View Code
第三道题目大意:
背景:好友推荐功能,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;
}
View Code