海康威视 U3D客户端开发 一面

1. 自我介绍和项目介绍

2.怎么判断一个点在凸多边形里面

答案:如果是凸多边形,最常见的方法就是判断这个点是否始终在每一条边的同一侧。具体做法是依次计算多边形每条边和目标点构成的叉积,如果所有叉积同号,说明点在凸多边形内部;如果有正有负,说明点在外部。这种方法的好处是实现简单,时间复杂度是 O(n),很适合面试时手写。

代码:

#include <vector>
using namespace std;

struct Point {
    double x, y;
};

double cross(const Point& a, const Point& b, const Point& c) {
    return (b.x - a.x) * (c.y - a.y) - (b.y - a.y) * (c.x - a.x);
}

bool isPointInConvexPolygon(const vector<Point>& poly, const Point& p) {
    int n = poly.size();
    if (n < 3) return false;

    double prev = 0;
    for (int i = 0; i < n; ++i) {
        double cur = cross(poly[i], poly[(i + 1) % n], p);
        if (cur != 0) {
            if (prev != 0 && cur * prev < 0) return false;
            prev = cur;
        }
    }
    return true;
}

3. 怎么判断一个点在平面多边形里面

答案:如果题目没有强调是凸多边形,那通常默认是普通多边形。这时候最常见的方法是射线法。从目标点向一个固定方向引一条射线,统计它和多边形边的交点个数。如果交点个数是奇数,说明点在多边形内部;如果是偶数,说明点在外部。这种方法实现比较通用,但要注意边界情况,比如点刚好在边上、射线经过顶点、水平边重复统计这些问题。

代码:

#include <vector>
#include <algorithm>
using namespace std;

struct Point {
    double x, y;
};

bool onSegment(const Point& a, const Point& b, const Point& p) {
    double cross = (b.x - a.x) * (p.y - a.y) - (b.y - a.y) * (p.x - a.x);
    if (cross != 0) return false;
    return p.x >= min(a.x, b.x) && p.x <= max(a.x, b.x) &&
           p.y >= min(a.y, b.y) && p.y <= max(a.y, b.y);
}

bool isPointInPolygon(const vector<Point>& poly, const Point& p) {
    int n = poly.size();
    bool inside = false;

    for (int i = 0, j = n - 1; i < n; j = i++) {
        if (onSegment(poly[j], poly[i], p)) return true;

        bool intersect = ((poly[i].y > p.y) != (poly[j].y > p.y)) &&
                         (p.x < (poly[j].x - poly[i].x) * (p.y - poly[i].y) /
                                    (poly[j].y - poly[i].y) + poly[i].x);
        if (intersect) inside = !inside;
    }
    return inside;
}

4. Protobuf 和 JSON 的区别

答案:这两个本质上都是数据序列化方式,但特点不一样。JSON 是

剩余60%内容,订阅专栏后可继续查看/也可单篇购买

C++ 常考面试题总结 文章被收录于专栏

本专栏系统梳理C++方向, 大中厂高频高频面试考点 , 内容皆来自真实面试经历,从基础语法、内存管理、STL与设计模式,到操作系统与项目实战,结合真实面试题深度解析,帮助开发者高效查漏补缺,提升技术理解与面试通过率,打造扎实的C++工程能力.

全部评论
总结的真的很好
点赞 回复 分享
发布于 03-24 23:41 北京

相关推荐

1.&nbsp;请详细介绍你的校园版即时聊天室项目,说明项目中遇到的分布式并发、资源竞争问题及解决思路,并说明项目可支撑的在线人数、QPS等性能指标。2.&nbsp;项目中用到了&nbsp;Reactor&nbsp;模型、线程池、Redis&nbsp;发布订阅、MySQL&nbsp;离线消息、一致性哈希负载均衡,请分别说明这些技术的实际落地方式与开发中遇到的坑点。3.&nbsp;聊天室项目中,如何处理Redis&nbsp;宕机导致的消息丢失问题?如何保证消息顺序一致性?4.&nbsp;你在实习中负责安卓前端数据处理与底层&nbsp;SDK&nbsp;对接,工作中做过哪些性能优化?遇到过哪些性能瓶颈?5.&nbsp;请说明&nbsp;C++&nbsp;中指针与引用的区别,以及各自优先使用的场景。6.&nbsp;请介绍&nbsp;C++&nbsp;智能指针的种类、适用场景,并说明智能指针存在的开销与循环引用问题如何解决。7.&nbsp;请说明野指针与悬空指针的区别,以及如何避免这两类问题。8.&nbsp;你掌握哪些多线程调试方法?如何排查线程阻塞、死锁问题?9.&nbsp;实际开发中遇到过哪些内存问题(内存泄漏、OOM、栈溢出等)?了解哪些内存检测工具,如何进行内存问题排查?10.&nbsp;多线程环境下使用&nbsp;STL&nbsp;容器需要注意什么?用过哪些线程同步方式,有无无锁编程思路?11.&nbsp;请详细说明&nbsp;TCP&nbsp;与&nbsp;UDP&nbsp;的区别,你的即时聊天室为什么选择&nbsp;TCP&nbsp;而非&nbsp;UDP?12.&nbsp;什么是&nbsp;TCP&nbsp;粘包问题?常见解决方法有哪些?你项目中是如何处理的?13.&nbsp;TCP&nbsp;传输过程中出现网络抖动、丢包、延迟时,如何处理?拥塞控制大致机制是什么?14.&nbsp;TCP&nbsp;是如何保证可靠传输的?超时重传、确认应答、滑动窗口分别起什么作用?15.&nbsp;项目中如何实现多服务器跨节点通信?Nginx&nbsp;负载均衡与一致性哈希分别如何使用?16.&nbsp;请说明&nbsp;vector&nbsp;/&nbsp;list&nbsp;/&nbsp;map&nbsp;/&nbsp;unordered_map&nbsp;的底层实现、优缺点及适用场景。17.&nbsp;你在项目中如何使用&nbsp;STL&nbsp;容器?请举例具体业务场景与选择依据。18.&nbsp;如果要在内存中高频维护用户列表、群组列表,你会选择什么容器?为什么?19.&nbsp;多线程环境下使用&nbsp;vector、unordered_map&nbsp;等容器需要注意什么?如何保证线程安全?20.&nbsp;安卓&nbsp;SDK&nbsp;基于&nbsp;C++&nbsp;开发,与&nbsp;Java&nbsp;层之间如何通信?是否了解&nbsp;JNI?21.&nbsp;你常用&nbsp;C++&nbsp;语法标准是哪些?项目中用到哪些&nbsp;C++11/14&nbsp;特性?22.&nbsp;简述主线程耗时操作优化思路,为什么不能在主线程做&nbsp;heavy&nbsp;计算或&nbsp;IO?
查看22道真题和解析
点赞 评论 收藏
分享
评论
点赞
2
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务