华为的2012年上机笔试程序

 1. 从两个数组的最后一个元素比较两个数组中不同元素的个数,如有 array1[5]={77,21,1,3,5}, array2[3]={1,3,5} ,从 array1[4] array2[2] 比较开始,到 array1[2] array[0] 比较结束。这样得出它们不同的元素个数为 0 ,若 array1[6]={77,21,1,3,5,7} ,那么他们不同的元素为 3

  函数原型为 int compare_array( int len1, int array1[], int len2, int array2[] );

  其中,len1len2分别为数组array1[]array2[]的长度,函数返回值为两个数组不同元素的个数。

   以下是上题的函数完整实现:

int compare_array(int len1 ,int array1[] , int len2 ,int array2[])

{

       int len ,i,j ,k,m;

       len = ((len1 <len2)?len1:len2);

       k = len; //k是最短的数组的长度,从这两个数组中找出相同的来,减去即可。

       i = len1-1;

       j = len2-1;

       for(m = len-1 ; m>=0 ;m--)

       {

              if( array1[i] ==array2[j] )

              {

                     k--;

              }

              i--;

              j--;

        

       }

       return k;

 

}

 

void main()

{

       int a[]={12,13,1,2,3};

       int b[]={1,2,3};

       int len1 = sizeof(a)/sizeof(int) ;

       int len2 = sizeof(b)/sizeof(int);

    int m = compare_array(len1 ,a ,len2 ,b);

       cout<<m<<endl;

}

 

2.

约瑟夫环是一个数学的应用问题:已知n个人(以编号1,2,3...n分别表示)围坐在一张圆桌周围。从编号为k的人开始报数,数到m的那个人出列;他的下一个人又从1开始报数,数到m的那个人又出列;依此规律重复下去,直到圆桌周围的人全部出列。

 

我们采用循环链表的方法;找到第一个要删除的节点 然后删除这个节点,在这个节点的下一个节点重新查找下一个要删除的节点,了一次类推,可把所有的节点删除。最后就会剩余一个节点,这个节点仍然是循环节点。

 

typedef struct LinkNode
{
 int data;
 struct LinkNode *next;
}node;


void JOSEPHUS(int n, int m,int k)
{
   node *p  ,*r ,*list,*tmp;
   list = NULL;
   r = (node*)malloc(sizeof(node));
   int i ,j ,x;
   for(i = 0 ;i < n ;i++)
   {
    p = (node*)malloc(sizeof(node));
    printf("输入节点数据");
    scanf("%d",&x);
    p->data = x;
    if(list == NULL)
    {
     list = p;

    }
    else
    {
     r->next = p;
    }
    r = p;
   
   }
   p->next = list;
   p = list;
   for(i = 0 ;i<k-1;i++) //找到第一个数
   {
       tmp=p;
    p = p->next;
   }
   while(p->next != p)
   {
    for(i = 0 ; i<m-1 ;i++)
    {
     tmp= p;
     p = p->next;
    }
    tmp->next = p->next;
    printf("要删除的数据:%d\n",p->data);
    free(p);
    p = tmp->next;
   }
   if(p->next == p)
   {
    printf("要删除的数据:%d\n",p->data);
   }

}

void main()
{
 int n = 9 ;
 int m = 5;
 int k =1;
 JOSEPHUS(9 ,m,k);

}

 

 

4 输入一个字符串,用指针求出字符串的长度。

 

 

int  str_len(char *str)
{
 int k , i;
 char *p;
 p = str;
 k = 0;
 i =0;
 while( *p!= '\0')
 {
      k++;
   p++;
 }
 return k;
}

void main()
{
 char str[]="abcde";
 int len =str_len(str);
 cout<<len<<endl;
}

 

5 问题:使用C语言实现字符串中子字符串的替换

 

描述:编写一个字符串替换函数,如函数名为 StrReplace(char* strSrc, char* strFind, char* strReplace)strSrc为原字符串,strFind是待替换的字符串,strReplace为替换字符串。

 

举个直观的例子吧,如:“ABCDEFGHIJKLMNOPQRSTUVWXYZ”这个字符串,把其中的“RST”替换为“ggg”这个字符串,结果就变成了:

 

ABCDEFGHIJKLMNOPQgggUVWXYZ

void strReplace(char *strsrc ,char *strreplace ,char *strfind)
{
 int i ,j ,m,n,k,t;
 for(i = 0 ;strsrc[i] !='\0' ;i++)
 {
  j = 0;
  if(strsrc[i] == strfind[j])
  {
   m = i;
   n = j;
   while(strsrc[m]==strfind[n]&&(strsrc[m] !='\0')&&(strfind[n]!='\0'))
   {
    m++;
    n++;
   }
   if(strfind[n]=='\0')
   {
    t= 0;
    for(k = i ;k<m;k++)
    {
     strsrc[k] = strreplace[t];
     t++;
    }
    cout<<strsrc<<endl;
    break;
   }
  }
 }
}

void main()
{
 char strsrc[]="abcdefg";
 char strfind[]="cde";
 char strreplace[]="www";
 strReplace(strsrc ,strreplace ,strfind);
}

 

 

6 问题:

编写一个程序实现功能:将字符串”Computer Secience”赋给一个字符数组,然后从第一个字母开始间隔的输出该串,用指针完成。

 

//编写一个程序实现功能:将字符串"Computer Secience"赋给一个字符数组,然后从第一个字母开始间隔的输出该串,用指针完成。
 
void main()
{
 char str[]="Computer Secience";
 int len = sizeof(str)/sizeof(char);
 char *p=str;
 
 while(*p)
 {
  //cout<<*p;
  printf("%c",*p);
  p++;
  p++;
  //len--;
  //len--;
 }
 printf("\n");
}

 

 

7问题:

编写一个程序实现功能:将两个字符串合并为一个字符串并且输出,用指针实现。

   char str1[20]={“Hello ”}, str2[20]={“World ”};

 

// 合并字符串
void hebing(char *str1 ,char *str2)
{
 char * p ,*q;
 p =str1;
 q = str2;
 while(*p)
 {
  p++;
 }

 while(*q)
 {
  *p = *q;
  p++;
  q++;
 }
 *p ='\0';
 cout<<str1<<endl;
}
void main()
{
 char str1[20]="hello";
 char str2[20]="word";
 hebing(str1 ,str2);
}

 

 

问题:

以下函数的功能是用递归的方法计算x的n阶勒让德多项式的值。已有调用语句p(n,x);编写函数实现功能。递归公式如下:

//问题:
//以下函数的功能是用递归的方法计算x的n阶勒让德多项式的值。已有调用语句p(n,x);编写函数实现功能。递归公式如下:
int f(int n ,int x)
{
 if(n==0)
 {
  return 1;
 }
 if(n==1)
 {
  return x;
 }
 if(n>1)
 {
  return ( ((2*n-1)*x*f(n-1,x) - (n-1)*f(n-2 ,x))/n);
 }
}
void main()
{
 int m;
 m = f(2,2);
 cout<<m<<endl;
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值