腾讯游戏实习生电话面试经验总结

      前几天收到了腾讯游戏实习生招聘的一个面试电话,面试华丽丽的挂了。期间问了一些C/C++的一些基础知识,以及数据结构的一些基础知识,比如一些排序的时间复杂度,空间复杂度,static 的作用等。时间过去几天了,好多记不得了。。。

      面试官给我出了这样的两道大的题目:

1、程序题目:将链表逆序;

2、智力题目,具体题目是:有一个大锅,里面有10斤油,有一个3斤的勺子,有一个10斤的大油桶,还有一个7斤的小油桶,如何操作,使得大小油桶各有5斤油?(答案略)

     当面试官先给我出了第一道题目之后,我首先想到的是以前做过的一道题目:逆序输出链表元素,不能改变链表结构。所以我的第一反应是使用栈或者递归实现,于是和面试官交流,但是面试官说可以改变链表的结构,当时感觉有点懵了,后来面试官说可以改变链表的的结构啊。我就突然就想起来一个思路,经过思考,在纸上写下了一个很差的代码,现在想想都很水,程序的非法输入和边界都没有考虑, 程序的健壮性(鲁棒性)太差。

     第二道题目很简单,答案略。

     虽然本次面试失败了,但是我想分享点经验给大家,希望大家能通过,也为自己攒人品。

     在结束面试之后,我查了资料,对第一题的分析,写下了如下的代码,希望和大家交流。

思路:

1、传入一个链表的头节点,首先先判断链表的头节点是否为空;

2、初始化三个指针;

3、进入循环,循环条件为链表头节点不为空;

          a、建立一个新的指针指向当前节点的next域;

          b、判断下一个指针域是否为空,如果为空,则让翻转后的头节点指向它;

          c、将当前节点与前一个节点连接起来;

          d、移动指针,将前一个指针指向当前节点,将当前指针指向后一个节点;

 4、返回头节点。

参考代码如下:

1、普通反转

结构体定义:

struct NodeList
{
    int value;
    struct NodeList  next;
};

函数实现:

NodeList *ReverseList(NodeList * pHead)
{
    NodeList * pNode = pHead;
    NodeList * pPrev = NULL;
    NodeList * pReverseHead = NULL;
    while(pNode != NULL)
    {
        NodeList *pNext = pNode->next;
        if(pNext == NULL)
        {

                 pReverseHead = pNode;
        }

        pNode->next = pPrev;
        pPrev = pNode;
        pNode = pNext;        
    }
    return pReverseHead;
}

2、递归反转

//递归反转。思路是将链尾开始反转。原链表中当前结点的下一结点。
node* resvers(node* pNode, node* & header)
{
 if (pNode == NULL || pNode->pNext == NULL)
 {
  header = pNode;
  return pNode;
 }
 else
 {
  //pTempNext 为已经反转后的链尾结点。
  node* pTempNext = resvers(pNode->pNext, header);
  pNode->pNext = NULL;
  //将当前结点添加到反转后的链尾
  pTempNext->pNext = pNode;
  //返回反转后的链尾。
  return pNode;
 }
}


你可能感兴趣的:(C++,招聘)