中兴软件面试题2

 现在的公司招聘,都要笔试面试.如果你不是那种编程功底非常深厚的人,又不好好准备一番,在笔试面试中往往会处于被动局面.虽然有些笔试题是故意为难我们,有点钻牛角尖.但是很多笔试题面试题确实能够很好地看出我们的基础.

   在这里,我就略去那些钻牛角尖的题.csdn论坛我近半年的收集中选出10道有代表性的题目,难度基本上是逐渐加大.对数组,指针,数据结构,算法,字符串,文件操作等问题都有覆盖.主要以c语言的实现为主,也有c++的题.大家可以先做做这10道题,测试一下自己的水平.

1. 下面这段代码的输出是多少(32位机上).

    char *p; 

    char *q[20];

    char *m[20][20];

    int (*n)[10];

    struct MyStruct

{

char dda;

double dda1;

int type ;

}

MyStruct  k;

 printf("%d %d %d %d",sizeof(p),sizeof(q),sizeof(m),sizeof(n),sizeof(k));

答案:4801600424

(1)

char a[2][2][3]={{{1,6,3},{5,4,15}},{{3,5,33},{23,12,7}} };

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

printf("%d ",__a[0][0][i]_);

在空格处填上合适的语句,顺序打印出a中的数字

(2)

char **p, a[16][8]; 

问:p=a是否会导致程序在以后出现问题?为什么?

答:没有问题,只是使用时要小心,p是指向指针的指针。

3.用递归方式,非递归方式写函数将一个字符串反转.

   函数原型如下:char *reverse(char *str);

答:非递归方式:

    char *reverse(char *str)

   {

     if(str!=NULL)

     {

      int length = strlen(str);

      for(int i=0;i<length/2;++i)

        {

           char temp=str[i];

           str[i]= str[length-1];

           str[length-1] =temp;

        }

     }

    printf("%s/n",str);

   }

   递归方式:搞不定

   char *reverse(char *str)

   {

    if(str==NULL||strlen(str)==1)

       return str;

    int i;

    if(i==1)

      str[i] = '/0';

      return str[i];

    。。。。

   }

4.strcpy函数和memcpy函数有什么区别?它们各自使用时应该注意什么问题?

答:strcpy函数:拷贝字符串

    memcpy函数:拷贝任何数据

5.写一个函数将一个链表逆序.

 答:简单

6一个单链表,不知道长度,写一个函数快速找到中间节点的位置.

 答:typedef struct linknode

    {

      int a;

      struct linknode *next;

    }linknode;

   linknode *findmiddle(linknode *head)

   {

     linknode *fast,*low,*p;

     if(head==NULL)

     {

        return NULL;

     }

     fast=low=head;

     while(!(p=fast->next)&&!p->next)

     {

        low=low->next;

        fast=p->next;

     }

     return low;

   }

写一个函数找出一个单向链表的倒数第n个节点的指针.(把能想到的最好算法写出).

  答:两个指针,第一个先于第二个n个位置。

   LinkNode IsLoopList(LinkNode *head,int n)

   {

      LinkNode *p1,*p2,*p3;

   P1 = head;

   While(n-->=0)

   {

     P3= p2->next;

     P2 = p3;

   }

   While(p3->next!=NULL)

   {

P3 = p3->next;

P1 = p1->next;

   }

   Return p1;   //p3到达结尾时,后于p3n个位置的就是倒数第n个节点。

 }

 

8补充一题:

给你一个单向链表的头指针,可能最后不是NULL终止,而是循环链表。题目问你怎么找出这个链表循环部分的第一个节点。比如下面的链表: 
0 -> 1 -> 2 -> 3 -> 4 -> 5 -> 6 -> 7 -> 8 -> (3) 
循环,就应该返回结点3的位置。 
当然尽量用少的空间和时间是题目的要求。

答:

 

10.判断链表是否循环;

答:bool IsLoopList(LinkNode *head)

{
 LinkNode *p1= head,*p2= head;
 if(head ->next==NULL)//
只包含头节点,且头节点的nextNULL说明肯定不是循环链表
    return false;
 do{
   p1=p1->next;      //
步长为1
   p2=p2->next->next; //步长为2
 }while(p2 && p2->next && p1!=p2);
 if(p1==p2)
   return true;
 else
   return false;

 

11.用递归算法判断数组a[N]是否为一个递增数组。

答:递归算法

#include <stdio.h>
#include <conio.h>
#define N 5

int Judgment(int a[]);

int main()
{
    int a[N], i, flag = 1;
    printf("Enter array data: ");
    for (i = 0; i < N; i++)
    {
        scanf("%d", &a[i]);  //
输入数组元素。
    }
     flag = Judgment(a);  //
调用递归函数
     if (flag == 1)
    {
        printf("increment array./n");
    }
    else if (flag == 0)
    {
        printf("no increment array./n");
    }
    getch();
    return 0;
}

int Judgment(int a[])
{
    static i = 0; //
注意这个是静态变量,必须用static
    if(i < N - 1)
    {
        if (a[i] > a[i + 1])
        {
            return 0;         

    }
        i++;
        Judgment(a);
    }    
       return 1;
}            

非递归算法:

 #include <stdio.h>
#include <conio.h>
#define N 5

int Judgment(int a[], int num);

int main()
{
    int a[N], i, flag = 1;
    printf("Enter array data: ");
    for (i = 0; i < N; i++)
    {
        scanf("%d", &a[i]);
    }
    flag = Judgment(a, N);
    
    if (flag == 1)
    {
        printf("increment array./n");
    }
    else if (flag == 0)
    {
        printf("no increment array./n");
    }
    getch();
    return 0;
}

 

int Judgment(int a[], int num)
{
    static i = 0, flag = 1;
  for(i=0; i<num; i++)
    {
     if (a[i] >= a[i+1])      //
假如发现哪两个不是递增,立刻跳出;
      {
        flag = 0;
        break;
      }
   }
    return flag;
}         

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值