程序员面试:记录猿辅导的一次面试经历(续)

参考:
https://blog.csdn.net/glw0223/article/details/88593416

本来以为只有hr面试了,但是又来了一次面试。

四面

leetcode相似题目。199. 二叉树的右视图

手写代码1


描述如下:

  • 二叉树的根结点是节点1
  • 从视角一看过去,节点4被节点1遮挡,节点5被节点3遮挡
  • 从视角二看过去,从近到远,从近到远依次看到的是2,1,3,6节点
分析
  • map的迭代器遍历,查找节点,排序
  • map 默认是按照键值升序排列的,看下图
    程序员面试:记录猿辅导的一次面试经历(续)_第1张图片
  • 建立坐标系,将节点全部投影到x坐标轴上,如下图
    程序员面试:记录猿辅导的一次面试经历(续)_第2张图片
#include 
struct MyNode{
    int value;
    MyNode *left;
    MyNode *right;
};
struct MyValue{
    int y;
    int value;
};
void f2(MyNode *root, int x, int y, std::map<int,MyValue> &m){
    printf("%d, %d \r\n",x,y);
    if(m.find(x)==m.end()){
        m[x]=MyValue{y,root->value};
    }else{
        if(y<m.find(x)->second.y){
            m[x]=MyValue{y,root->value};
        }
    }
    if(root->left){
        f2(root->left,x-1,y+1,m);
    }
    if(root->right){
        f2(root->right,x+1,y+1,m);
    }
}
void f1(MyNode *root){
    if(root!=nullptr){
        std::map<int,MyValue> myMap;
        f2(root,0,0,myMap);
        std::map<int,MyValue>::iterator it = myMap.begin();
        while (it!=myMap.end()) {
            printf("%d\r\n",it->second.value);
            it++;
        }
    }
}

测试代码

int main(int argc, const char * argv[]) {
    // insert code here...
    std::cout << "Hello, World!\n";
    MyNode root{1,nullptr,nullptr};
    root.left=new MyNode{2,nullptr,nullptr};
    root.right=new MyNode{3,nullptr,nullptr};
    MyNode *p = root.left;
    p->right = new MyNode{4,nullptr,nullptr};
    p=p->right;
    p->right=new MyNode{5,nullptr,nullptr};
    p=p->right;
    p->right=new MyNode{6,nullptr,nullptr};
    f1(&root);
}
手写代码2

程序员面试:记录猿辅导的一次面试经历(续)_第3张图片
描述如下:

  • 单链表
  • 删除编号是奇数的节点,返回删除节点后的单链表
分析
  • 单链表的删除节点,一般需要三个节点指针。p0、p1、p2,其中p1是要删除的节点,p2是下一个节点,p0是上一个节点,删除p1后,p0->next=p2。
  • s t r u c t struct struct c l a s s class class的结尾要加上分号
struct SingleNode{
    int value;
    SingleNode *next;
};
SingleNode* function(SingleNode *root){
    SingleNode *ret = nullptr;
    if(root!=nullptr){
        if (root->next==nullptr){
            delete root;
            root = nullptr;
        }else{
            SingleNode *p=root;
            SingleNode *p1=root;
            int seq=1;
            while (p) {
                if(seq%2){
                    SingleNode *t1 = p;
                    p=p->next;
                    p1->next=p;
                    if(seq==1){
                        ret = p;
                        p1 = p;
                    }
                    delete t1;
                }else{
                    p=p->next;
                }
                seq++;
            }
        }
    }
    return ret;
}
其他零散问题
  • 连麦情况下,sdk上的线程模型是什么?是多个实例吗?

五面

hr面试。

你可能感兴趣的:(面试)