搜狗面试

参加搜狗输入法开发组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

1.可以考虑采用“分而治之”的思想,按照IP地址的Hash(正整数)%(2.5亿/2G+1)值,把正整数分别存储到多个小文件中。这样,每个小文件最多包含2G个记录; 
2.对于每一个小文件,可以构建一个IP为key,出现次数为value的Hash map,同时记录当前出现次数为1的记录;

5 条件:有rand()随机函数,输出范围为0-7的实数,服从均匀分布

a:  利用条件找输出范围为0-10,服从均匀分布的函数

b: 若rand()随机函数,输出范围为0-7的正整数,求输出范围为0-10的正整数,服从均匀分布的函数

a: rand()/7*10

 

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值