腾讯面试题目
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; }