同学昨天去参加华为软件机试,一共三道题,难度依次递增,两个小时。第一题普遍很简单,基本都能写出来,第二题难度适中,相对费些时间,第三题一般情况下就不是我等非软件专业在规定时间内能驾驭的了的啦。废话不多说,发几道我同学记下的题,还有我自己敲的代码。
第一题(60分):
按要求分解字符串,输入两个数M,N;M代表输入的M串字符串,N代表输出的每串字符串的位数,不够补0。例如:输入2,8, “abc” ,“123456789”,则输出为“abc00000”,“12345678“,”90000000”
我写的代码如下:
#include <iostream> void cut(int n,const char *input); int main() { char str[20][20] = {"abc","1234567890"}; int n = 8; //设置截取长度 int m = 2; //设置字符串个数 for (int i = 0; i < m; i++) { cut(n,str[i]); } return 0; } void cut(int n,const char *input){ char temp[100][100]; int i = 0,j = 0,k = 0; if (strlen(input) <= n) //若字符串长度小于或者等于要求截取长度 { //则依次将输入的字符串中的字符放入临时二维数组temp的第一行 for (i = 0; i < n; i ++) //并将大于n的地方补0 { if (input[i] != '\0') { temp[j][k ++] = input[i]; }else { temp[j][k++] = '0'; } } }else //若字符串长度大于要求截取长度 { //则当列数没到达n时,依次将输入中的字符放入temp第一行 for (i = 0; i < strlen(input); i++) { if ((i + 1) % n != 0) { temp[j][k++] = input[i]; }else { temp[j][k++] = input[i]; //当列数到达n时,依次将输入中的字符放入temp的下一行 k = 0; j++; } } while (k < n) { temp[j][k++] = '0'; //将最后一行剩下的元素补0 } } for (i = 0; i <=j; i++) { temp[i][k] = '\0'; //给每一行末尾添加空字符 } for (i = 0; i <=j; i++) { std::cout << temp[i] <<'\n'; //依次输出结果 } }
还是一道第一题,我另一个同学记得
第一题:拼音转数字
输入是一个只包含拼音的字符串,请输出对应的数字序列。转换关系如下:
描述: 拼音 yi er san si wu liu qi ba jiu
阿拉伯数字 1 2 3 4 5 6 7 8 9
输入字符只包含小写字母,所有字符都可以正好匹配
运行时间限制:无限制
内存限制: 无限制
输入: 一行字符串,长度小于1000
输出: 一行字符(数字)串
样例输入: yiersansi
样例输出: 1234
#include <iostream> void numTrans(const char *input,char *output); int main(int argc, const char * argv[]) { char pinYinShuZi[1000] = "yiersansiwuliuqibajiu"; char shuZi[100]; numTrans(pinYinShuZi, shuZi); std::cout << pinYinShuZi << std::endl; std::cout << shuZi << std::endl; return 0; } void numTrans(const char *input,char *output) { char temp[100]; //用于临时保存转换出的阿拉伯数字 int i = 0,j = 0; for (i = 0; i < strlen(input); i++) { switch (input[i]) { //遍历字符串,分别将拼音转换成阿拉伯数字,并放入temp数组 case 'y': i++; temp[j++] = '1'; break; case 'e': i++; temp[j++] = '2'; break; case 's': if (input[i + 1] == 'a') { i++; i++; temp[j++] = '3'; }else{ i++; temp[j++] = '4'; } break; case 'w': i++; temp[j++] = '5'; break; case 'l': i++; i++; temp[j++] = '6'; break; case 'q': i++; temp[j++] = '7'; break; case 'b': i++; temp[j++] = '8'; break; case 'j': i++; i++; temp[j++] = '9'; break; default: break; } } temp[j] = '\0'; //给数字数组末尾添加空字符 for (i = 0; i <= j; i++) { output[i] = temp[i]; //把临时数组赋给输出字符串 } }
第二题:去除重复字符并排序
运行时间限制:无限制
内容限制: 无限制
输入: 字符串
输出: 去除重复字符并排序的字符串
样例输入: aabcdefff
样例输出: abcdef
因为此题我没看懂是去除输入里的所有相同字符,还是仅去除相邻的有重复的字符,所以在代码里两种方法都写了,其中一种方法被我注释了
#include <iostream> void transAndSort(const char * input,char * output); int main(int argc, const char * argv[]) { char str[100] = "aabcdefffa"; char res[100]; transAndSort(str,res); std::cout << str << std::endl; std::cout << res << std::endl; return 0; } void transAndSort(const char * input,char * output) { int i = 0,j = 1,n,m; int flag = 0; char temp[100]; char ex; temp[0] = input[0]; // for (i = 1; i < strlen(input); i++) { //去除重复的字符 // if (input[i - 1] != input[i]) { //仅保存与前一个字符不相等的字符 // temp[j++] = input[i]; //此处是去除几个相邻的重复的字符的方法 // } // } for (i = 1; i < strlen(input); i++) { //此代码块去除字符串中所有有重复的字符 for (m = 0; m < j; m++) { //依次将input中的字符与temp中的所有字符比较 if (temp[m] == input[i]) { //若有相同则舍去 flag = 1; } } if (flag != 1) { //flag置1则说明现input的字符与temp中的字符有重复 temp[j++] = input[i]; }else flag = 0; } temp[j] = '\0'; //这时j等于strlen(temp) for (i = 0; i < j - 1; i++) for (n = 0;n < j - 1 - i;n++) { if (temp[n] > temp[n + 1]) { ex = temp[n]; temp[n] = temp[n + 1]; temp[n + 1] = ex; } } for (i = 0; i <= j; i++) { output[i] = temp[i]; } }
输入一个正整数X,在下面的等式左边的数字之间添加+号或者-号,使得等式成立。
1 2 3 4 5 6 7 8 9 = X
比如:
12-34+5-67+89 = 5
1+23+4-5+6-7-8-9 = 5
请编写程序,统计满足输入整数的所有整数个数。
输入: 正整数,等式右边的数字
输出: 使该等式成立的个数
样例输入:5
样例输出:21(此处经大家提醒已更正)
这道题有一定难度,在下暂时还没有搞定,大家有什么想法可以一起讨论下!
去吃饭了,明天就周一了,大家珍惜今天晚上的自由时光吧