您的位置:首页 > 其它

2015届华为校园招聘机试题及参考答案

2015-09-06 10:22 676 查看
第一题(60分):

按要求分解字符串,输入两个数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;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: