腾讯面试题目

1. 给出洗牌的一个算法,并将洗好的牌存储在一个整形数组里。

  int card[54] = { 1,2,3,4 ... }

  for (int i = 0 ; i < 54 ; i++){

    int r = randint(0,54);

    swap(card[i], card[r]);

  }

  时间复杂度为O(n) 

2. 输入两个字符串,从第一字符串中删除第二个字符串中所有的字符。例如,”They are students.”和”aeiou”,则删除之后变成”Thy r stdnts.”

  遍历第一个字符串,并设两个指针(pFast和pSlow),初始的时候都指向第一字符的起始位置。

  如果不是hashTable里面,*pSlow=*pFast,pSlow++,pFast++;

  如果在hashTable里面,pFast++即可。

  最后*pSlow='\0'

3. 用递归的方法判断整数组a[N]是不是升序排列.

  void is_ascend(int[] a,int len)

  {
    if(len == 1) return true;
    if(a[len] < a[len-1])

      return false;
    else

      return is_ascending(a,len-1);
  }

4. 有一堆1万个石头和1万个木头,对于每个石头都有1个木头和它重量一样, 把配对的石头和木头找出来。

  > 可以对木头和石头分别排序,然后一一对应配对;

  > 对木头排序,然后取一个石头,匹配对应木头

  > 把木头扔到水里,根据吃水深度排序;把石头从等高的足够光滑的斜坡滑下,根据水平滑行距离排序,然后一一对应配对

5. 实现两个正整数的除法(m/n),当然不能用除法操作符

  枚举1 2 3...n,太慢就2倍的增长,如果2^n 大于m,则m-2^n-1重复上述过程,举个例子来说,

  100/7 :  7*1,7*2,7*4,7*8,因为7*16>100,所以这个时候就100-7*8=44接着下一次循环。
  也就是 100 = 7 * 8 + 7 * 6 + 2

6. 求一个二叉树中任意两个节点间的最大距离,两个节点的距离的定义是这两个节点间边的个数,优化时间空间复杂度。

  A: 左子树的最大深度,通过根节点,右子树的最大深度
  B: 不穿过根节点,而是左子树或右子树的最大距离路径
  三者比较,取最大的

void FindMaxDis(BSTreeNode *pNode, int &deepth, int &maxdis)
{
    if (pNode==NULL)
    {
        deepth=0;maxdis=0;
        return;
    }
    int l_deepth=0,r_deepth=0;
    int l_maxdis=0,r_maxdis=0;

    if (pNode->m_pleft)
        FindMaxDis(pNode->m_pleft,l_deepth,l_maxdis);
    if (pNode->m_pright)
        FindMaxDis(pNode->m_pright,r_deepth,r_maxdis);

    deepth = (l_deepth > r_deepth ? l_deepth : r_deepth) + 1;
    maxdis = l_maxdis > r_maxdis ? l_maxdis : r_maxdis ;
    maxdis = (l_deepth+r_deepth) > maxdis ? (l_deepth+r_deepth) : maxdis;
}
int FindMaxDis(BSTreeNode *pNode)
{
    int deepth, maxdis;
    FindMaxDis(pNode,deepth,maxdis);
    return maxdis;
}

 

posted on 2015-06-09 12:53  keketse  阅读(321)  评论(0编辑  收藏  举报

导航