华为2012机考ifif

      昨天去参加了华为的校园招聘上机考试,题目一共三道,都比较简单,不要求算法效率,也不要求对所给数据的合法性作检测,主要还是注重基础知识的考察,和大家分享一下,希望对接下来的同学有所帮助。

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

            函数接口   int cal_score(int score[], int judge_type[], int n) 

#include<stdio.h>

#include<string.h>

#include<iostream.h>

#include<conio.h>

#defineN 5

 

intcal_score(int score[], int judge_type[], int n)

{

       int expert=0;

    int dazhong=0;

       int zongfen=0;

       int i;

       int number=0;

      

       for(i=0;i<N;i++)

       {

              if(judge_type[i]==1)

              {

                     expert=expert+score[i];

                     number++;

              }

              else dazhong=dazhong+score[i];

       }

       if(number==N)

       {

              zongfen=(int)(expert/N);

       }

       else

    {

              expert=(int)(expert/number);

              dazhong=(int)(dazhong/(N-number));

              zongfen=int(0.6*expert+0.4*dazhong);

       }

       return zongfen;

}

intmain()

{

       int score[N];

       int judge_type[N];

       int numberlast=0;

       int i;

       printf("please input the %dscore:\n",N);

       for(i=0;i<N;i++)

              scanf("%d",&score[i]);

       printf("please input thelevel(1:expert,2:dazhong)\n");

       for(i=0;i<N;i++)

              scanf("%d",&judge_type[i]);

       numberlast=cal_score(score,judge_type,N);

       printf("the last score is%d\n",numberlast);

       return 0;

}


      2、给定一个数组input[] ,如果数组长度n为奇数,则将数组中最大的元素放到 output[] 数组最中间的位置,如果数组长度n为偶数,则将数组中最大的元素放到 output[] 数组中间两个位置偏右的那个位置上,然后再按从大到小的顺序,依次在第一个位置的两边,按照一左一右的顺序,依次存放剩下的数。

      例如:input[] = {3, 6, 1, 9, 7}   output[] = {3, 7, 9, 6, 1};             input[] = {3, 6, 1, 9, 7, 8}    output[] = {1, 6, 8, 9, 7, 3}

             函数接口   void sort(int input[[, int n, int output[])

#include<stdio.h>

#include<string.h>

#include<conio.h>

 

 

 

void sort(intinput[], int n, int output[])

{

       int i,j;

       int k=1;

       int temp;

       int med;

       for(i=0;i<n;i++)

              for(j=0;j<n-i;j++)

                     if(input[j]>input[j+1])

                     {temp=input[j];input[j]=input[j+1];input[j+1]=temp;}

 

                     if(n%2!=0)

                     {

                            for(i=0;i<n;i++)

                                   printf("%2d",input[i]);

                            printf("\n");

                            med=(n-1)/2;

                            output[med]=input[n-1];

                            for(i=1;i<=med;i++)

                            {

                                   output[med-i]=input[n-1-k];

                                   output[med+i]=input[n-2-k];

                                   k=k+2;

                                  

                            }

                     }

                     else

                     {

                           

                            for(i=0;i<n;i++)

                                   printf("%2d",input[i]);

                            printf("\n");

                            med=n/2;

                            output[med]=input[n-1];

                            for(i=1;i<=med-1;i++)

                            {

                                   output[med-i]=input[n-1-k];

                                   output[med+i]=input[n-2-k];

                                   k=k+2;  

                            }

                            output[0]=input[0];                        

                     }    

                     for(i=0;i<n;i++)

                                   printf("%2d",output[i]);

                            printf("\n");

}

 

 

int main()

{

       int a[6]={3,6,1,9,7,8};

       int b[6]={0};

       for(int i=0;i<6;i++)

              printf("%2d",a[i]);

       printf("\n");

       sort(a,6,b);

       return 0;

}


      3、操作系统任务调度问题。操作系统任务分为系统任务和用户任务两种。其中,系统任务的优先级 < 50,用户任务的优先级 >= 50且 <= 255。优先级大于255的为非法任务,应予以剔除。现有一任务队列task[],长度为n,task中的元素值表示任务的优先级,数值越小,优先级越高。函数scheduler实现如下功能,将task[] 中的任务按照系统任务、用户任务依次存放到 system_task[] 数组和 user_task[] 数组中(数组中元素的值是任务在task[] 数组中的下标),并且优先级高的任务排在前面,优先级相同的任务按照入队顺序排列(即先入队的任务排在前面),数组元素为-1表示结束。

      例如:task[] = {0, 30, 155, 1, 80, 300, 170, 40, 99}    system_task[] = {0, 3, 1, 7, -1}    user_task[] = {4, 8, 2, 6, -1}

             函数接口    void scheduler(int task[], int n, int system_task[], int user_task[])

#include<stdio.h>

#include<string.h>

#include<malloc.h>

#include<iostream.h>

 

voidscheduler1(int task[], int n, int system_task[], int user_task[])

{

       int i;

       int j=0;

       int *p,*pp,*p_user,*pp_user;

       int index=0;

       int count,count2;

       int min=0;

       int k=0;

       p=(int*)malloc(sizeof(int)*n);

       for(i=0;i<n;i++)

              p[i]=0;

       pp=(int*)malloc(sizeof(int)*n);

       for(i=0;i<n;i++)

              pp[i]=0;

       p_user=(int*)malloc(sizeof(int)*n);

       for(i=0;i<n;i++)

              p_user[i]=0;

       pp_user=(int*)malloc(sizeof(int)*n);

       for(i=0;i<n;i++)

              pp_user[i]=0;

      

       for(i=0;i<n;i++)

       {

              if(task[i]<50)

              {

                     {

                            system_task[j]=task[i];

                            pp[j]=i;

                            j++;

                     }

                     count=j;

              }

             

              else if(task[i]<=255)

              {

             

                     {

                            user_task[k]=task[i];

                            pp_user[k]=i;

                            k++;

                     }

                     count2=k;

              }

              else task[i]=task[i];

      

       }

      

       for(i=0;i<count;i++)

              printf("%3d",system_task[i]);

       printf("\n");

      

      

       for(i=0;i<count;i++)

       {

              min=system_task[0];

              for(j=1;j<count;j++)

              {

                    

                     if(system_task[j]<min)

                     {

                            min=system_task[j];  

                            p[i]=j;          

                     }

                    

              }

              system_task[p[i]]=51;

       }

      

    pp[count]=-1;

       for(i=0;i<count;i++)

              printf("%3d",pp[p[i]]);     

       printf("%3d\n",pp[count]);

      

      

       /***********************************************************/

      

       for(i=0;i<count2;i++)

              printf("%4d",user_task[i]);

       printf("\n");

      

       for(i=0;i<count2;i++)

       {

              min=user_task[0];

              for(j=1;j<count2;j++)

              {

                    

                     if(user_task[j]<min)

                     {

                            min=user_task[j];      

                            p_user[i]=j;         

                     }

                    

              }

              user_task[p_user[i]]=256;

       }

      

    pp_user[count2]=-1;

       for(i=0;i<count2;i++)

              printf("%4d",pp_user[p_user[i]]);  

       printf("%3d\n",pp_user[count2]);

      

      

}

 

int main()

{

       int task[9]={0, 30, 155, 1, 80, 300,170,40, 99};

       int system_task[9]={0};

       int user_task[9]={0};

       scheduler1(task,9,system_task,user_task);

       return 0;

}

第三题的这种做法的排序的过程有点看不懂,下面贴出来我自己的做法,用的是常见的冒泡法排序的修改版,没有用指针用的是数组,这点不太好,

#include <stdio.h>
#include <malloc.h>
#include <assert.h>
int schedule(int task[],int n,int system_task[],int user_task[]);
int schedule(int task[],int n,int system_task[],int user_task[])
{
        int i=0,j=0,temp=0;
        int a=0,b=0,c=0,d=0;
        for(i;i<n;i++)
        {
                if(task[i]<50)
                {
                        system_task[a]=i;
                        a++;
                }
                else if(task[i]>=50&&task[i]<=255)
                {
                        user_task[b]=i;
                        b++;
                }
                else
                {
                //nothing
                }
        }
        for(i=0;i<n;i++)
        {
                printf("%d ",system_task[i]);
        }
        printf("\n");
        for(i=0;i<n;i++)
        {
                printf("%d ",user_task[i]);
        }

        //重新排序
        for(i=n-1;i>=0;i--)
        {
                if(system_task[i]!=0)

                {
                        c=i+1;
                        break;
                }
        }
        for(i=n-1;i>=0;i--)
        {
                if(user_task[i]!=0)
                {
                        d=i+1;
                        break;
                }
        }

        int *p=(int *)malloc(sizeof(int)*(c+1));
        int *q=(int *)malloc(sizeof(int)*(d+1));

        assert(p!=NULL);
        assert(q!=NULL);
        for(i=0;i<c;i++)
        {
                p[i]=system_task[i];
        }
        p[c]=-1;
        for(i=0;i<d;i++)
        {
                q[i]=user_task[i];
        }
        q[d]=-1;
        for(i=0;i<c;i++)

                for(j=i;j<c;j++)
                {
                        if(task[system_task[i]]>task[system_task[j]])
                        {
                                temp=task[system_task[i]];
                                task[system_task[i]]=task[system_task[j]];
                                task[system_task[j]]=temp;
                                temp=p[i];
                                p[i]=p[j];
                                p[j]=temp;
                        }
                }
        }
        for(i=0;i<d;i++)
        {
                for(j=i;j<d;j++)
                {
                        if(task[user_task[i]]>task[user_task[j]])
                        {
                                temp=task[user_task[i]];
                                task[user_task[i]]=task[user_task[j]];
                                task[user_task[j]]=temp;
                                temp=q[i];
                                q[i]=q[j];
                                q[j]=temp;
                        }
                }
        }
        printf("\nresult:\n");
        for(i=0;i<=c;i++)
        {
                printf("%d ",p[i]);
        }
        printf("\n");
        for(i=0;i<=d;i++)

        {
                printf("%d ",q[i]);
        }

        return 0;
}
int main()
{
        int task[]={0,30,155,1,80,300,170,40,99};
        int system_task[9]={0};
        int user_task[9]={0};
        schedule(task,9,system_task,user_task);
        return 0;
}

4.问题描述:我国手机号码标准格式为:国家码+手机号码 ,例如8613912345678。特点如下
1,长度为13位
2。以86开头
3。号码的每一位都是数字
请实现手机号码合法性判断函数(无须关注手机号码的真实性)
1。如果手机号码合法 返回0
2。如果手机号码长度不合法 返回1
3。如果手机号码中包含非数字的字符,返回2
4。如果手机号码不是以86打头的,返回3
注意:以上优先级依次降低,也就是说如果长度不合法,则直接返回2,无须继续判断

代码如下:
#include.....
#include <assert.h>
#include <string.h>
int check_phone(char *p);
int check_phone(char *p)
{
        int num;
        int i;
        num=strlen(p);
        printf("%d\n",num);
        if(num==13)
        {
                        for(i=0;i<strlen(p);i++)
                        {
                                if(*(p+i)>='0'&&*(p+i)<='9'){}
                                else
                                        return 2;
                        }
                        if((*p=='8')&&(*(p+1)=='6'))
                        {
                                return 0;
                        }
                        else
                                return 3;
        }
        else
        return 1;

}

int main()
{
        char *p=(char *)malloc(sizeof(char)*13);
        assert(p!=NULL);
        printf("please enter the phone number:\n");
        scanf("%s",p);
        //printf("%d",strlen(p));
        printf("%d\n",check_phone(p));
        return 0;
}









  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值