参加搜狗输入法开发组C++面试,第一轮是做编程卷子,内容包括C函数运行和结构算法编程实现。
结构和算法方向有下面几道题:
1 单链表逆序函数实现
Node* ListInverse(Node* header)
{
Node* curNode = head;
Node* curNext = curNode->next;
if (!curNode)
{
return NULL;
}
// 设置倒序链表尾部为空
head->next = NULL;
while(curNext)
{
Node* cur2 = curNext->next;
curNext->next = curNode;
curNode = curNext;
curNext = cur2;
}
return curNode;
}
2 给出一个二叉查找树,树结构用链表实现。在不创建新节点的条件下,转换为中序输出的双向链表
// 树的中序遍历
typedef struct struBiTNode
{
int data;
struBiTNode * lchild, *rchild; // 前节点,后节点
}BiTNode, *BiTree;
void InOrderTraverse(BiTree T)
{
if (T==NULL)
{
return NULL;
}
BiTNode* lNode = T->lchild;
BiTNode* rNode = T->rchild;
InOrderTraverse(lNode);
lNode->rchild = T;
rNode->lchild = T;
InOrderTraverse(rNode);
}
3 a:定义结构体,实现普通栈的操作,包括 Push(), Pop(), GetSize()
b:在a的基础上,实现时间复杂度为O(1)的Min()操作,更改上述结构体定义
#define MAXN 10
class stack
{
protected:
int stackTop;
int stackItem[MAXN];
int stackSize;
public:
stack()
{
stackTop = -1;
}
virtual void Push(int x)
{
if (stackTop+1>=MAXN)
{
throw exception("error");
}
else
{
stackTop++;
stackItem[stackTop] = x;
stackSize++;
}
};
virtual int Pop()
{
int ret;
if (stackTop<0)
{
throw exception("error");
}
else
{
ret = stackItem[stackTop];
stackTop--;
stackSize--;
}
return ret;
};
const int GetSize()const{return stackSize;};
};
class stackMin: public stack
{
private:
int stackMinItem[MAXN];
int minItemIndex;
public:
stackMin()
{
minItemIndex = -1;
}
virtual void Push(int x)
{
if (x<Min())
{
minItemIndex++;
stackMinItem[minItemIndex] = x;
}
stack::Push(x);
}
virtual int Pop()
{
int a = stack::Pop();
if (a == stackMinItem[minItemIndex])
{
minItemIndex--;
}
}
int Min()
{
if (stackMinItem>=0)
{
return stackMinItem[minItemIndex] ;
}
return 1000;
}
};
4 在2.5亿的正整数中找只出现一次的元素集合,内存限制为2G
算法思想:分而治之+Hash
2.对于每一个小文件,可以构建一个IP为key,出现次数为value的Hash map,同时记录当前出现次数为1的记录;
5 条件:有rand()随机函数,输出范围为0-7的实数,服从均匀分布
a: 利用条件找输出范围为0-10,服从均匀分布的函数
b: 若rand()随机函数,输出范围为0-7的正整数,求输出范围为0-10的正整数,服从均匀分布的函数
a: rand()/7*10