jake1036

6-14 XX网实习生笔试总结

                  XX网实习生笔试

    1 校内网实习生C++笔试总结
      时间为1小时,小题都为填空题共8道,大题有四道。 总体来说小题没有跑出面试宝典+effective c++ 两本书。
     大题整体也不是太复杂,但是仍然感到犀利。
   2 填空题
      (1) 一个 #define SUM(a+b) a + b
              然后输出 SUM(a , b) * SUM(c , d) 这个题应该大家都注意过,宏经常会出现的问题。
       (2)还有一个考察 sizeof() 和 strlen()的问题。
              考察 char s1[] , 与 char *s2 之间的区别,注意一点s1是个字符数组,sizeof(s1) = 字符串长度 + 1 (最后一个0) , sizeof(s2) = 4
               strlen 是一个函数,求取的是字符串的长度,对s1和s2结果都一样,但是注意strlen不需要计数最后一个0 字符。
       (3)定义一个结构体 ,结构体中有一个函数,函数中有一个输出语句。
              然后声明一个结构体指针,但是该指针为NULL。使用该指针调用函数,即使该指针为空,但是不会出现异常。
              所谓异常是指访问了非法内存,但是此种情况不是。
       (4)考察了 父类子类的 构造函数和析构函数的执行顺序 。
       (5)1000个硬币 ,只有一个与其余999个不同,求找出该硬币的最小次数。我猜的是用2分
       (6) 100 * 1000 平米中种树,树苗之间相隔至少为1米,求最多种多少树。
        (7)有一个字符串 复制操作符构造函数,就是考察了 copying 函数,c++ 变焦模糊的地方。
         (8)忘了。。。。。

  3 大题
     (1)求最大公约数,gcd ,思路两个数a , b  ,首先注意当两者之中有其一为0,需要直接返回0。
           然后递归是gcd(b , a%b)
      (2)进程间通信方式
            (a)管道方式: 半双工通信,单向流动只能在具有亲缘关系的进程之间通信,即父子进程。
            (b)有名管道:半双工通信,允许无亲缘关系的进程之间通信。
            (c)信号量: 实际上是一个计数器,可以用来控制多个进程对共享资源的访问。它常作为一种锁机制,
                   来控制多个进程对共享资源的访问。缺点是传递的数据量比较少。
            (d)  消息队列:是消息的队列,存放在内核中,并由消息队列标识符标示。
                   消息队列客服了消息传递的数据量过少,管道只承载无格式字节流以及缓冲区大小受限。
            (e)  信号: 一种复杂的机制,用来通知某进程某项任务已经完成。
           (f)共享内存: 实质上开辟了一块内存,这块内存由一个进程创建,多个进程共享。
                  这是最快的IPC方式 。它是针对其它进程运行效率低而实现的。
            (g)套接字socket: 同样是一种进程之间通信方式,但是可以作用于不同机器上的不同进程。
        (3)用c++实现一段单例模式的代码,要求是实现线程安全机制,使用mutex,这题不太明白。
               难道自己实现mutex? c++语言本身没有同步的信号量。 要么就是调用系统调用。。
       (4)合并两个有序的单链表。纠结许久,还是打算实现了。
      

#include <iostream>
#include 
<stdio.h>
#include 
<stdlib.h>
  
using namespace std ;
    
  
struct Node
  
{
    
int data ;
    Node 
* next ;
  }
 ;    
  
  
void buildlist(Node * & node) 
  
{
    
int x  ; 
    cin
>>x ;
    
while(x)
    
{
      
if(!node)      
      
{
         node 
= (Node *)malloc(sizeof(Node)) ;  
         node
->data = x ;
         node
->next = 0 ; 
      }
else
      
{
         Node 
* temp = (Node *)malloc(sizeof(Node)) ;
         temp
->data = x ;   
         temp
->next = node ; 
         node 
= temp ; 
      }

      cin
>>x ;
    }
    
  }
  
 
  
//merge two sorted linked list
  Node * merge(Node * h1 , Node * h2)
  
{
    
if(!h1)  return h2 ; 
    
if(!h2)  return h1 ;
    Node 
* p ;Node * q ; Node * r ; Node * h; 
    
if(h1->data <= h2->data)
    
{
      p 
= h1 ; q = h2 ;
    }
 else{
      p 
= h2 ; q = h1 ;
    }
 
    r 
= p ;
    
while(p && q)
    
{
      
while(p && p->data <= q->data)   
       
{
         h 
= p ;
         p 
= p->next ;
       }

       
if(p){
         h
->next = q ; 
         Node 
* tmp = q->next ;
         q
->next = p ;
         q 
= tmp ;
         h 
= h->next ;
      }
else
         h
->next = q ;
         
return r ;    
      }
     
    }

       
return r ;
  }
  
   

  
void output(Node * h)
  
{
     
while(h)
     
{
       cout
<<h->data<<"  ";
       h 
= h->next ;
     }

  }


  
int main()
  
{
     
      Node 
* h1 = 0 ;
      Node 
* h2 = 0 ;
      buildlist(h1) ; 
      buildlist(h2) ;
      Node 
* r = 0  ;
      r 
= merge(h1 , h2) ;
      output(r) ;
      getchar() ;
      
return 0 ;
  }


   

 












       
               

posted on 2011-06-15 10:54 kahn 阅读(274) 评论(0)  编辑 收藏 引用


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理