华为公司上机笔试题剖析

来源:互联网 发布:mac上图片编辑 编辑:程序博客网 时间:2024/05/17 04:17

  最近正值各大名企校园招聘高峰期,电信、互联网行业对软件研发人员的需求很大,所以招聘时一般考核应聘者的C、C++基本编程能力,笔者最近意欲向华为、爱立信、腾讯等电信互联网企业示好,所以从网上搜集了历届几道机试真题,写好给与各位探讨,函数执行效率未在考虑之列。

/*问题描述:0·64位的数字以字符串形式输入,乘以一个0-9之间的任意数字,结果以字符串输出*/
void longMultiply(char* num, int nummultiply, char* result)
{
int i,j;
int cnt=0;                                  //位数统计辅助
long temp;                               //辅助变量
int data=0;
int one_array;
long sum=0;

/*方法一:实现库函数atol()*/
/*
int num_len = strlen(num);   //获取输入字符串长度
for(i=0;i<num_len;i++)
{
 data = num[i]-'0';                    //计算字符串对应的位
 one_array = data*powf(10.0,(float)(num_len-1-i));
 sum+=one_array;                 //求和
}
*/

/*方法2:使用库函数,在允许的情况下,执行效率较高*/
sum = atol(num);                     

long out = nummultiply*sum;  //计算乘积
printf("out:%d\n",out);
/*统计Long型数的位数*/
temp = out;
while(temp!=0)
{
 temp = (long)temp/10;
 cnt++;                                       //计数变量加1
}
printf("cnt:%d\n",cnt);
/*赋值到字符数组中*/
    for(j=0;j<cnt;j++)
{
 result[cnt-1-j] = out%10+'0';
 out/=10;
}
printf("Result:%s\n",result);
}

 问题描述:分为专家评委和大众评委,score[] 数组里面存储每个评委打的分数,judge_type[] 里存储与 score[] 数组对应的评委类别,judge_type == 1,表示专家评委,judge_type == 2,表示大众评委,n表示评委总数。打分规则如下:专家评委和大众评委的分数先分别取一个平均分(平均分取整),然后,总分 = 专家评委平均分  * 0.6 + 大众评委 * 0.4,总分取整。如果没有大众评委,则 总分 = 专家评委平均分,总分取整。函数最终返回选手得分。

/*选秀节目打分题*/
 int cal_score(int score[], int judge_type[], int n) //注意此处的数组作为函数的参数是指针类型 
 {
   int i,j,k;
   int judge_num=0;
   int whole_score=0;
   int sum1=0,sum2=0;
   int cnt=0;
   //判断是不是有大众评委
   for(i=0;i<n;i++)
  judge_num += judge_type[i];
   if(judge_num==n) //如果全为专家评委
   {
   //总分为专家评委分数取平均
  for(j=0;j<n;j++)
  whole_score += score[j];
  whole_score /= n; //求平均分
   }
   //如果两类评委都有
   else
   {
     for(k=0;k<n;k++)
{
  if(judge_type[k]==1) //如果是专家评委
{
 sum1 += score[k];
 cnt++;  //统计专家评委数目
   }
  else            //如果是大众评委
  {
    sum2 += score[k];
  }
}
whole_score = 0.6*sum1/cnt+0.4*sum2/(n-cnt);
   }
   return whole_score;
 }

/*爬坑问题描述:乌龟爬一个深n m的坑,白天爬5m,晚上滑下来2m,请问几天可以爬上去
入口参数:int n 坑的高度
返回值:int day 天数*/
int climbRamp(int n)
{
  int days=1;
  if(n<=5)
    days=1; //如果小于或者等于5m,一天可以爬上来
  else 
  {
 do{
 n-=3;
 days++;
 }while(n>5);
  }
  return days;
}


/*字符串处理函数:大写变小写,小写变大写,0-9数字保留,其余字符去除
入口参数:str处理前的字符指针,strResult处理后的字符指针
返回值:无
*/
void dealString(char* str,char* strResult)
{
while(*str!='\0')
{
 if(*str>='A'&&*str<='Z') //大写字母
 {
   *str+=32;
*strResult = *str;
str++;
strResult++;
 }
 else if(*str>='a'&&*str<='z')
 {
   *str-=32;
*strResult = *str;
str++;
strResult++;
 }
 else if(*str>='0'&&*str<='9')
 {
   *strResult = *str;
str++;
strResult++;
 }
 else 
 {
   str++;
 }
}
*strResult='\0';
}


/*计算n的阶乘*/
long fac(int n)
{
  long result;
  if(n==1)
 result=1;
  else
 result=n*fac(n-1);
  return result;
}
/*计算1!+2!+3!+4!+......+n!
入口参数:自然数n
出口参数:计算的自然数阶乘和*/


long calculate(int n)
{
  long sum=0;
  int i;
  for(i=1;i<=n;i++)
  {
    sum+=fac(i);
  }
  return sum;
}