搜狗2012笔试、面试体会

本文分享了作者参加搜狗2012年笔试与面试的经历,涉及指针操作、虚函数、类继承、动态绑定等知识点。题目包括计算内存大小、动态选择成员函数、棋盘覆盖问题、O(n)时间复杂度找众数以及用rand7模拟rand10等,展现了面试中对数据结构和算法的考察重点。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、C/C++(10道)
1、求输出
   int a[]={1,2,3,4,5}
   int*ptr = (int*)(&a+1)

   printf("%d %d", *(a+1), *(ptr-1));

答:a与&a的地址是一个,&a的类型是int[5],所以打印结果为2、5

2、
class A{
   virtual foo("A");
}
class B:A{
   foo("B")
}
void func(A a){
   a.foo();
}
void func1(A* ptr)
{
   a->foo();
}
void func2(A &a)
{
   a.foo()

}

答:第一个调用A中foo,第二个根据ptr指向的类型来选择,第三个根据a所引用的类型来选择。 A、B、B。

int main()
{
    B b;
    func(b),func1(&b),func2(b);
}
3、
union u{
    struct{
        int a;
        short b;
        char c;
    } s;
    char d;

};

求sizeof(u)

答:8

4、

class A{

       virtual void print(int a=3)

      {

               printf("A=%d\n", a);

      }

};

class B:public A

{

         virtual void print(int b=5)

        {

                 printf("B=%d\n",b);

        }

};

int main()

{

     A*ptr = new B();

     ptr->print();

     return 0;

}

求输出结果。

答:输出B=3。函数动态绑定,参数默认绑定。

二、数据结构(10道)
1、顶点度与边关系
2、2叉树前序中序求后序
3、双向链表插入新节点
4、AVL、B+、Hash常见应用
5、各种排序比较次数
三、大题
1、p()是一个概率生成器,有p的概率生成0,1-p的概率生成1,问如何实现g()生成均匀的0、1分布
2、给一个数组A[], 求输出Output[], Output[i]为所有A[]中元素乘积除了A[i],比如:A[10], 那么Output[3]=A[0]*A[1]*A[2]*A[4]*...A[9]

要求不许用除法,在O(n)时间中算出Output[]

3、棋盘覆盖问题(经典)

4、O(n)求数组中的众数

5、rand7()实现rand10()

总结:前面的几个语言题难度还是蛮大的,如果不使用很难理解。棋盘覆盖问题非常巧妙。

6、LCS最长公共子串

### 如何根据前序和中序遍历计算二叉树的后序遍历 为了实现这一目标,可以遵循以下逻辑: #### 构建二叉树 构建二叉树的过程依赖于前序遍历和中序遍历的特点。由于前序遍历的第一个元素总是当前子树的根节点,在中序遍历中找到这个根节点的位置,则该位置左侧的部分属于左子树,右侧部分属于右子树[^1]。 #### 后序遍历特性 后序遍历按照 左子树 -> 右子树 -> 根 的顺序访问各个结点。因此一旦知道了完整的二叉树结构之后,就可以很容易地执行后序遍历操作来获取最终的结果列表[^4]。 下面是具体的Python代码示例用于解释上述过程: ```python class TreeNode: def __init__(self, val=0, left=None, right=None): self.val = val self.left = left self.right = right def buildTree(preorder, inorder): if not preorder or not inorder: return None root_val = preorder[0] root_index_in_inorder = inorder.index(root_val) root = TreeNode(root_val) # Recursively construct the left subtree and assign it to current node's left child. root.left = buildTree(preorder[1 : 1 + root_index_in_inorder], inorder[:root_index_in_inorder]) # Similarly do for the right sub-tree. root.right = buildTree(preorder[root_index_in_inorder + 1:], inorder[root_index_in_inorder + 1:]) return root def postorderTraversal(root): result = [] stack = [(root, False)] while stack: node, visited = stack.pop() if node is None: continue if visited: result.append(node.val) else: stack.append((node, True)) stack.append((node.right, False)) stack.append((node.left, False)) return result ``` 这段程序首实现了`buildTree()`函数用来重建原始的二叉树;接着定义了一个名为`postorderTraversal()`的方法来进行迭代式的后序遍历,并返回相应的值列表作为结果[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值