RT,就是今天上午刚举办的比赛,周同学在赛后留了一份题目的拷贝,正好借来做记录
c/c++和java的题目应该是一样的
整体来说还是字符操作为主的基础题,不过做得真是太郁闷,最后一题的规则数组竟然开小了(低维的长度应该是7,误开成6了),满盘皆输
决赛基本无望= = 还需多多修炼啊
题后顺便附上自己土土的c/c++代码
1. 就餐抽查(30分)
• 问题描述:
某公司由于人多,午餐分为多批次就餐,严格要求每批次就餐时间。并定期抽查就餐情况。
请编写程序实现就餐抽查情况。
• 要求实现函数:
void check_lunch(int num, int time,int input[], int output[])
【输入】 int num,就餐总人数
int time,就餐分批数
int input[],就餐情况
【输出】 int output[], 违规就餐情况
【返回】 无
注:对就餐分3批的情况,12人就餐,正确的就餐情况应如下分布:
[1,2,3,1,2,3,1,2,3,1,2,3],不符合该分布的即是违规,输出时对相应位置0。
• 示例
1)输入:num = 12,time = 3,input =[1,2,3,3,1,3,1,1,1,1,2,3]
输出:output = [1,2,3,0,0,3,1,0,0,1,2,3]
2)输入:num = 11,time = 4,intput = [1,2,3,4,2,3,3,4,1,2,3]
输出:output = [1,2,3,4,0,0,3,4,1,2,3]
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | void check_lunch(int num, int time,int input[], int output[]) { if (time < 1){ memset(output, 0, num * sizeof(int)); return; } for (int i = 0; i < num; ++i){ if (input[i] != (i % time) + 1){ output[i] = 0; }else{ output[i] = input[i]; } } } |
-------------------------------------------------------------------------------------------
2. 输入联想(30分)
•问题描述:
输入联想功能是非常实用的一个功能,请编程实现类似功能。
•要求实现函数:
void auto_complete(char *str, char *tmp,char *output)
【输入】 char *str,候选字符串
char *tmp,输入字符串
【输出】 int *output,联想匹配的字符串
【返回】 无
注:候选字符串以空格隔开,输入字符串仅从字符串开始处匹配。
将匹配的子字符串输出,同样以空格隔开。
如无匹配成功的子字符串,则输出空字符串。
•示例
1)输入:str = chengdu chongqing,tmp = c
输出:output = chengdu chongqing
2)输入:str = chengdu chongqing,tmp = che
输出:output = chengdu
3)输入:str = beijing nanjing,tmp = jing
输出:output =
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | void auto_complete(char *str, char *tmp, char *output) { char* str_copy = strdup(str); char* token = strtok(str_copy, " "); int tipLength = strlen(tmp); output[0] = '\0'; while (token){ if (strncmp(token, tmp, tipLength) == 0){ strcat(output, token); strcat(output, " "); } token = strtok(NULL, " "); } if (strlen(output) > 0){ output[strlen(output) - 1] = '\0'; // remove the last space } free(str_copy); } |
-------------------------------------------------------------------------------------------
3. 语法分析(40分)
•问题描述:
编译器通过语法分析来检测程序的一些语法问题。
要求实现一个简单的语法分析程序,判断输入的字符串是否有符合要求的语法组合。
需要判断的语法组合有:
if then
if ( ) then
switch case end
switch ( ) case end
switch ( ) case default end
do while
if then ( ) switch case end default do while
•要求实现函数:
void analysis(char *str,int *num)
【输入】 char *str,待分析字符串
【输出】 int num,匹配的组合个数
【返回】 无
注:输入字符串中关键字以空格隔开,"if"、"("、")"、"case"等均表示关键字。
从左向右,找到匹配的组合即可。
组合一定是相互分离,不会嵌套,不会有交叉情况出现。
•示例
1)输入:str = if then,
输出:num = 1
2)输入:str = switch case aaa ,
输出:num = 0
3)输入:str = if ( aaa ) then do bbb while switch cas ,
输出:num = 2
和第二题感觉有点重复,还好规则不会嵌套,所以写得很土也可以过(
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 | void analysis(char *str,int *num) { char* words[] = {"if", "then", "(", ")", "switch", "case", "end", "default", "do", "while"}; int wordsNum = 10; int rules[6][7] = { {2, 0, 1}, {4, 0, 2, 3, 1}, {3, 4, 5, 6}, {5, 4, 2, 3, 5, 6}, {6, 4, 2, 3, 5, 7, 6}, {2, 8, 9} }; //"rules[x][0] = v" means there are v keywords in rule x int rulesNum = 6; int rev[255]; int revNum = 0; (*num) = 0; char* str_copy = strdup(str); char* token = strtok(str_copy, " "); while (token){ for (int i = 0; i < wordsNum; ++i){ if (strcmp(token, words[i]) == 0){//check if the current word is a keyword rev[revNum++] = i; for (int j = 0; j < rulesNum; ++j){//check every rules if (revNum < rules[j][0]){ continue; } bool found = true; for (int k = 0; k < rules[j][0]; ++k){ if (rules[j][k + 1] != rev[revNum - rules[j][0] + k]){ found = false; break; } } if (found){//it fits a rule revNum = 0; ++(*num); break; } } break; } } token = strtok(NULL, " "); } free(str_copy); } |
最后很好奇,如果第二题写:
1 2 3 4 | void auto_complete(char *str, char *tmp, char *output) { strcpy(output, str); } |
第三题写:
1 2 3 4 | void analysis(char *str,int *num) { *num = 0; } |
交上去,会拿到多少分呢?(比赛是机器阅卷,估计会以各测试用例的正确性来评分)
一条评论
[...] 难度也是比去年的提高了不少(去年题还都停留在字符串操作上 见:http://blog.thpiano.com/?p=543) 不过就是华为那边服务器运行结果慢如牛,比完了都不知道结果…… [...]