2015届华为校园招聘机试题及参考答案
2015-09-06 10:22
676 查看
第一题(60分):
按要求分解字符串,输入两个数M,N;M代表输入的M串字符串,N代表输出的每串字符串的位数,不够补0。例如:输入2,8, “abc” ,“123456789”,则输出为“abc00000”,“12345678“,”90000000”。
输入是一个只包含拼音的字符串,请输出对应的数字序列。转换关系如下:
描述: 拼音 yi er san si wu liu qi ba jiu
阿拉伯数字 1 2 3 4 5 6 7 8 9
输入字符只包含小写字母,所有字符都可以正好匹配
运行时间限制:无限制
内存限制: 无限制
输入: 一行字符串,长度小于1000
输出: 一行字符(数字)串
样例输入: yiersansi
样例输出: 1234
第二题:去除重复字符并排序
运行时间限制:无限制
内容限制: 无限制
输入: 字符串
输出: 去除重复字符并排序的字符串
样例输入: aabcdefff
样例输出: abcdef
第三题:等式变换
输入一个正整数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
方法二:暴力解法
按要求分解字符串,输入两个数M,N;M代表输入的M串字符串,N代表输出的每串字符串的位数,不够补0。例如:输入2,8, “abc” ,“123456789”,则输出为“abc00000”,“12345678“,”90000000”。
#include <iostream> using namespace std; void decomposition(char* str, int n, int len) { int num = len/n; int yu = len%n; char *tempstr = str; for(int i=0; i<num; i++){ for(int j=0; j<8; j++){ cout<<*tempstr; tempstr++; } if(i == num - 1) cout<<" "; } while(*tempstr != '\0'){ cout<<*tempstr; tempstr++; } for(int i=0; i<(8-yu); i++){ cout<<"0"; } cout<<"\n"; } int main() { char str[1000]; int m,n,len; while(scanf("%d %d",&m,&n) != eof){ for(int i=0; i<m; i++){ scanf("%s", str); len = strlen(str); decomposition(str, n, len); } } system("pause"); return 0; }第一题:拼音转数字
输入是一个只包含拼音的字符串,请输出对应的数字序列。转换关系如下:
描述: 拼音 yi er san si wu liu qi ba jiu
阿拉伯数字 1 2 3 4 5 6 7 8 9
输入字符只包含小写字母,所有字符都可以正好匹配
运行时间限制:无限制
内存限制: 无限制
输入: 一行字符串,长度小于1000
输出: 一行字符(数字)串
样例输入: yiersansi
样例输出: 1234
#include <iostream> using namespace std; void chineseTonum(char* str) { int i = 0; while(str[i] != '\0'){ switch(str[i]){ case 'y': cout<<"1"; i += 2; break; case 'e': cout<<"2"; i += 2; break; case 's': if(str[i+1] == 'a'){ cout<<"3"; i += 3; break; } else if(str[i+1] == 'i'){ cout<<"4"; i += 2; break; } case 'w': cout<<"5"; i += 2; break; case 'l': cout<<"6"; i += 3; break; case 'q': cout<<"7"; i += 2; break; case 'b': cout<<"8"; i += 2; break; case 'j': cout<<"9"; i += 3; break; default: break; } } cout<<endl; } int main() { char str[1000]; while(cin>>str){ chineseTonum(str); } system("pause"); return 0; }
第二题:去除重复字符并排序
运行时间限制:无限制
内容限制: 无限制
输入: 字符串
输出: 去除重复字符并排序的字符串
样例输入: aabcdefff
样例输出: abcdef
#include <iostream> using namespace std; void removeDumplicateChar(char* str) { int strHash[256] = {0}; int i; while(str[i] != '\0'){ strHash[str[i]] ++; i++; } for(i=0; i<256; i++){ if(strHash[i] != 0){ cout<<(char)i; } } cout<<endl; } int main() { char str[100]; while(cin>>str){ removeDumplicateChar(str); } system("pause"); return 0; }
第三题:等式变换
输入一个正整数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
#include<iostream> #include<cstdio> using namespace std; int ops[21]; const char sym[3] = {'+' , '-' , ' '}; int result , num; void dfs(int layer, int currentResult, int lastOp, int lastSum) { lastSum *= (layer > 9) ? 100 : 10; lastSum += layer; if(layer == 9) { currentResult += (lastOp) ? (-1 * lastSum) : lastSum; if(currentResult == result) { ++num; printf("1"); for(int i = 2 ; i <= 9 ; ++i) { if(sym[ops[i-1]] != ' ') printf(" %c ", sym[ops[i-1]]); printf("%d", i); } printf(" = %d\n" , result); } return; } ops[layer] = 2; dfs(layer + 1 , currentResult , lastOp , lastSum); //Continue currentResult += (lastOp)? (-1 * lastSum) : lastSum; ops[layer] = 0; dfs(layer + 1 , currentResult , 0 , 0); //Plus ops[layer] = 1; dfs(layer + 1 , currentResult , 1 , 0); //Minus } int main(void) { while(scanf("%d", &result) != EOF) { num = 0; dfs(1 , 0 , 0 , 0); printf("%d\n" , num); } return 0; }
方法二:暴力解法
#include <iostream> using namespace std; int sum = 0; int a[]={1,2,3,4,5,6,7,8,9}; //定义一个全局的数组 int create_util(int start,int end) { int sum_; sum_=0; while(start<=end) { sum_=sum_*10+a[start++]; } return sum_; } void create(int start,int end,int result)//开始处理 { int k,temp; if(start>end&&result!=0)//当到达最后一个且不为0,结束 { return ; } if(result==0&&start>end) sum++;//全局的统计数加一 for(k=start;k<=end;k++)//从start开始以后都是进行同样的操作 { temp=create_util(start,k);//计算对应的值 create(k+1,end,result-temp);//- create(k+1,end,result+temp);//+ } } int main() { int temp,result; while(cin>>result) { sum = 0; for(int i=0;i<9;i++)//考虑到第一个必是正数,单独考虑 { temp=create_util(0,i);//计算其对应的十进制值 create(i+1,8,result-temp);//开始对{1,2,3,4,5,6,7,8,9}后面的值进行处理 } cout<<sum<<endl; } }
相关文章推荐
- Windows 7/XP 局域网络共享文件详细设置教程
- 史上最详细的Android Studio系列教程三--快捷键
- 程序员:如果不能自学,那就放弃吧
- 读写锁
- Ollydbg -p 16440
- Linux基础-硬
- android-----三种方式(sax、pull、dom)解析xml文件
- VC:正在驱动科技与人类生活的十大趋势
- 笔试-判断是否素数
- 【LINUX】——gvim中如何配置字体和背景
- 漏洞演练平台
- git 笔记
- 史上最详细的Android Studio系列教程二--基本设置与运行
- 在Windows Server2003中运行3D游戏
- Codeforces 487b Strip, dp + RMQ(经典)
- <PY>利用7z暴力破解压缩文件密码
- 开发者必知的KPI概念和用法
- 第二次作业
- poj2774 后缀数组
- COMBINATORIAL TESTING