试题做的很匆忙,不能保证完全正确。代码也没加注释,以后有时间需要慢慢改进。
2013年华为软件校园招聘编程测验
类别:软件C/C++语言
编程题(共3题)
注意:
1、请上机编写程序,按题目要求提交文件。[详见考试说明,点击进入考试说明]
2、本试题采用自动执行测试用例进行评分,测试用例不对考生公开
3、评卷通过在给定用例输入下,严格按照试题要求比较考生实现函数的输出与预设输出。两者相同则得分,不同则不得分
4、评卷人保证测试用例输入参数的合法性,考生不用考虑输入参数非法或异常的情况,题目中注明的例外
5、评卷人保证测试用例输入在被测函数正常合法情况下使用不会导致程序错误
6、被要求实现的函数如果包含返回参数,该返回参数涉及的空间分配和释放均在函数外完成,在被要求实现函数内部可以直接使用返回参数
7、如果考生函数异常导致程序崩溃或死循环,则自动评卷可能会被人为终止,剩余用例不被执行,无法得分
8、基于上述阅卷规则,请考生严格按照题目要求功能实现程序,尽量保证实现函数的稳健性,同时建议完成一道题并调试保证正确性后,再考虑并
实现下一题目
1 字串转换
问题描述:
将输入的字符串(字符串仅包含小写字母‘a’到‘z’),按照如下规则,循环转换后输出:a->b,b->c,…,y->z,z->a;若输入的字符串连续出现两个字母相同时,后一个字母需要连续转换2次。例如:aa 转换为 bc,zz 转换为 ab;当连续相同字母超过两个时,第三个出现的字母按第一次出现算。
要求实现函数:
int convert(char *input ,char* output)
【输入】 char *input , 输入的字符串
【输出】 char *output ,输出的字符串
【返回】 无
示例
输入:char *input="abcd"
输出:char *output="bcde"
输入:char *input="abbbcd"
输出:char *output="bcdcde"
此为流程图,首先遍历数组中每个元素,如果第二个元素等于第一个元素、或者元素位置第3、4.。。。。。。。。。等,如果其与前一个元素相等,而与前一个个元素的前一个元素不等,则将其转化为前一个元素转化的结果加1.即output[i]=output[i-1]+1;其他情况下output[i] = input[i]+1,当然如果input[i] = 'z',则output[i]= 'a',这种情况要注意。
#include <iostream> using namespace std; const int N = 300; int convert(char *input, char* output) { int i, len = strlen(input); for (i = 0; i < len; i++){ if ((i == 1 && input[i] == input[i-1]) || (i > 1 && input[i] == input[i-1] && input[i] != input[i-2])){ output[i] = ((output[i-1] - '0') + 1)+'0'; }else if (input[i] == 'z'){ output[i] = 'a'; }else{ output[i] = ((input[i] - '0') + 1)+'0'; } } output[i] = '\0'; return 0; } int main() { char input[N],output[N]; cin>>input; convert(input, output); cout<<output<<endl; return 0; }
2 字符串处理转换
问题描述:
在给定字符串中找出单词( “单词”由大写字母和小写字母字符构成,其他非字母字符视为单词的间隔,如空格、问号、数字等等;另外单个字母不算单词);找到单词后,按照长度进行降序排序,(排序时如果长度相同,则按出现的顺序进行排列),然后输出到一个新的字符串中;如果某个单词重复出现多次,则只输出一次;如果整个输入的字符串中没有找到单词,请输出空串。输出的单词之间使用一个“空格”隔开,最后一个单词后不加空格。
要求实现函数:
void my_word(char input[], char output[])
【输入】 char input[], 输入的字符串
【输出】 char output[],输出的字符串
【返回】 无
示例
输入:char input[]="some local buses, some1234123drivers" ,
输出:char output[]="drivers local buses some"
输入:char input[]="%A^123 t 3453i*()" ,
输出:char output[]=""
#include <iostream> #include <cstring> using namespace std; const int N = 300, M = 100; struct nodeList{ char nodeStr[M]; int nodeLen; }; bool getExistence(char *pStr, nodeList *node, int n) { bool b = true; for (int i = 0; i < n; i++){ if (strcmp(pStr, node[i].nodeStr) == 0){ b = false; break; } } return b; } void my_word(char input[], char output[]) { nodeList node[M]; int i, j, len, tmpLen, n, flag; len = strlen(input); for (i = 0; i < len; i++){ if ((input[i] >= 'a' && input[i] <= 'z')||(input[i] >= 'A' && input[i] <= 'Z')){ output[i] = input[i]; }else{ output[i] = '0'; } } output[i] = '\0'; i = 0; char *pStr = strtok(output, "0"); while (pStr){ tmpLen = strlen(pStr); if (tmpLen > 1 && getExistence(pStr,node,i)){ strcpy(node[i].nodeStr,pStr); node[i].nodeStr[tmpLen] = '\0'; node[i].nodeLen = tmpLen; i++; } pStr = strtok(NULL,"0"); } memset(output,'\0',N*sizeof(char)); n = i, j = 0; while (j < n){ flag = 0; for (i = 1; i < n; i++){ if (node[i].nodeLen > node[flag].nodeLen){ flag = i; } } node[flag].nodeLen = 0; strcat(output, node[flag].nodeStr); tmpLen = strlen(output); if (j == n-1){ output[tmpLen] = '\0'; }else{ output[tmpLen] = ' '; output[tmpLen + 1] = '\0'; } j++; } } int main() { char input[N], output[N]; cin.getline(input, N); my_word(input,output); for (int i = 0; i < strlen(output); i++){ cout<<output[i]; } cout<<endl; return 0; }
3 正数减法
问题描述:
两个任意长度的正数相减,这两个正数可以带小数点,也可以是整数,请输出结果。 输入的字符串中,不会出现除了数字与小数点以外的其它字符,不会出现多个小数点以及小数点在第一个字符的位置等非法情况,所以考生的程序中无须考虑输入的数值字符串非法的情况。 详细要求以及约束:
1.输入均为正数,但输出可能为负数;
2.输入输出均为字符串形式;
3.如果输出是正数则不需要带符号,如果为负数,则输出的结果字符串需要带负号
例如:2.2-1.1 直接输出为“1.1”,1.1-2.2 则需要输出为“-1.1”
4.输出的结果字符串需要过滤掉整数位前以及小数位后无效的0,小数位为全0的,直接输出整数位
例如相减结果为11.345,此数值前后均不可以带0,“011.345”或者“0011.34500”等等前后带无效0的均视为错误 输出。例如1.1-1.1结果为0.0,则直接输出0。
要求实现函数:
void Decrease(char *input1, char *input2, char *output)
【输入】 char *input1 被减数
char *input2 减数
【输出】 char *output 减法结果
【返回】 无
示例
输入:char *input1="2.2"
char *input2="1.1"
输出:char *output="1.1"
输入:char *input1="1.1"
char *input2="2.2"
输出:char *output="-1.1"
#include <iostream> #include <cstring> using namespace std; const int N = 300; void getDifference(char *inputMax,char *inputMin, int len, char *tmp1input){ int i = len - 1, flag = 0, tmp; memset(tmp1input,'\0',N*sizeof(char)); while (i >= 0){ if (inputMax[i] != '.'){ tmp = (inputMax[i]-'0')-(inputMin[i]-'0') - flag; if (tmp >= 0){ tmp1input[i] = tmp + '0'; flag = 0; }else{ tmp1input[i] = (10 + tmp) + '0'; flag = 1; } }else{ tmp1input[i] = '.'; } i--; } } void abandonTailZero(char *tmp1input){ int flag = 0, i = strlen(tmp1input) - 1; while (i >= 0){ if (flag == 0){ if (tmp1input[i] != '0'){ if (tmp1input[i] == '.'){ tmp1input[i] = '\0'; }else{ tmp1input[i+1] = '\0'; } flag = 1; } }else{ break; } i--; } } char * abandonheadZero(char *tmp1input){ int flag = 0, i = 0; char *p = tmp1input; while (i < strlen(tmp1input)){ if (flag == 0){ if (tmp1input[i] != '0'){ if (tmp1input[i] == '.'){ p = &tmp1input[i-1]; }else{ p = &tmp1input[i]; } flag = 1; } }else{ break; } i++; } return p; } int main() { char input1[N], input2[N], output[N], input11[N], input12[N], input21[N], input22[N], tmp1input[N], tmp1[N], *pOut; int len11, len12, len21, len22, len, i, flag3 = 0; bool b = true; memset(output,'\0',N*sizeof(char)); cin>>input1>>input2; char *pInput1 = strtok(input1,"."); if (pInput1){ len11 = strlen(pInput1); strcpy(input11,pInput1); input11[len11] = '\0'; } pInput1 = strtok(NULL,"."); if (pInput1){ len12 = strlen(pInput1); strcpy(input12,pInput1); input12[len12] = '\0'; } char *pInput2 = strtok(input2,"."); if (pInput2){ len21 = strlen(pInput2); strcpy(input21,pInput2); input11[len21] = '\0'; } pInput2 = strtok(NULL,"."); if (pInput2){ len22 = strlen(pInput2); strcpy(input22,pInput2); input22[len22] = '\0'; } if (len11 < len21){ for (i = 0; i < len21 - len11; i++){ tmp1[i] = '0'; } tmp1[i] = '\0'; strcat(tmp1,input11); tmp1[len21] = '\0'; strcpy(input11,tmp1); input11[len21] = '\0'; len11 = len21; }else if (len11 > len21){ for (i = 0;i < len11 - len21; i++){ tmp1[i] = '0'; } tmp1[i] = '\0'; strcat(tmp1,input21); tmp1[len11] = '\0'; strcpy(input21,tmp1); input21[len11] = '\0'; } if (len12 > len22){ for (i = len22; i < len12; i++){ input22[i] = '0'; } input22[i] = '\0'; }else if (len12 < len22){ for (i = len12; i < len22; i++){ input12[i] = '0'; } input12[i] = '\0'; len12 = len22; } input11[len11] = '.'; input11[len11 + 1] = '\0'; input21[len21] = '.'; input21[len21 + 1] = '\0'; strcat(input11,input12); strcat(input21,input22); len = len11 + 1 + len12; input11[len] = '\0'; input21[len] = '\0'; if (strcmp(input11,input21) > 0){ getDifference(input11, input21, len, tmp1input); }else if (strcmp(input11,input21) < 0){ flag3 = 1; getDifference(input21, input11, len, tmp1input); }else { output[0] = '0'; output[1] = '\0'; b = false; } if (b){ abandonTailZero(tmp1input); pOut = abandonheadZero(tmp1input); len = strlen(pOut); if (flag3 != 0){ output[0] = '-'; output[1] = '\0'; len++; } strcat(output,pOut); output[len] = '\0'; } cout<<output<<endl; return 0; }