C++查找算法面试题

1. 二分查找的原理和实现?

答案:

  • 前提条件数组必须有序支持随机访问
  • 原理每次比较中间元素根据比较结果缩小一半搜索范围时间复杂度:O(log n)
  • 迭代实现
int binarySearch(vector<int>& arr, int target) {
    int left = 0, right = arr.size() - 1;
    while (left <= right) {
        int mid = left + (right - left) / 2;
        if (arr[mid] == target)
            return mid;
        else if (arr[mid] < target)
            left = mid + 1;
        else
            right = mid - 1;
    }
    return -1;
}
  • 递归实现
int binarySearch(vector<int>& arr, int left, int right, int target) {
    if (left > right) return -1;
    int mid = left + (right - left) / 2;
    if (arr[mid] == target)
        return mid;
    else if (arr[mid] < target)
        return binarySearch(arr, mid + 1, right, target);
    else
        return binarySearch(arr, left, mid - 1, target);
}
  • 注意事项使用 left + (right - left) / 2 避免溢出注意边界条件循环不变量

2. 二分查找的变体有哪些?

答案:

  • 查找第一个等于target的位置
int findFirst(vector<int>& arr, int target) {
    int left = 0, right = arr.size() - 1;
    int result = -1;
    while (left <= right) {
        int mid = left + (right - left) / 2;
        if (arr[mid] == target) {
            result = mid;
            right = mid - 1;  // 继续向左找
        } else if (arr[mid] < target) {
            left = mid + 1;
        } else {
            right = mid - 1;
        }
    }
    return result;
}
  • 查找最后一个等于target的位置
int findLast(vector<int>& arr, int target) {
    int left = 0, right = arr.size() - 1;
    int result = -1;
    while (left <= right) {
        int mid = left + (right - left) / 2;
        if (arr[mid] == target) {
            result = mid;
            left = mid + 1;  // 继续向右找
        } else if (arr[mid] < target) {
            left = mid + 1;
        } else {
            right = mid - 1;
        }
    }
    return result;
}
  • 查找第一个大于等于target的位置(lower_bound)
  • 查找第一个大于target的位置(upper_bound)

3. 哈希查找的原理?如何设计哈希函数?

答案:

  • 原理通过哈希函数将键映射到数组索引直接访问,O(1)时间复杂度需要处理冲突
  • 好的哈希函数特点计算简单快速均匀分布,减少冲突确定性(相同输入相同输出)
  • 常见哈希函数除留余数法:hash(key) = key % M乘法哈希:hash(key) = (A * key) % M字符串哈希:
int hashString(string s) {
    int hash = 0;
    for (char c : s) {
        hash = hash * 31 + c;
    }
    return hash;
}
  • STL的hash为基本类型提供默认哈希函数可以自定义hash函数

4. 布隆过滤器是什么?

答案:

  • 定义空间效率高的概率型数据结构用于判断元素是否在集合中可能误判(false positive),但不会漏判
  • 原理使用位数组和多个哈希函数插入:多个哈希函数计算位置,置1查询:检查所有位置是否都为1
  • 特点空间效率极高不支持删除(可用计数布隆过滤器)有误判率,可通过增加位数组大小降低
  • 应用网页URL去重垃圾邮件过滤缓存穿透防护数据库查询优化

5. 跳表是什么?

答案:

  • 定义有序链表的扩展通过多层索引实现快速查找平均O(log n)的查找时间
  • 结构最底层是完整的有序链表上层是下层的索引每层约一半节点
  • 操作查找:从最高层开始,逐层下降插入:随机决定节点层数删除:删除所有层的节点
  • 优势实现简单,比红

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

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

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

全部评论

相关推荐

三棵树&nbsp;营销业务类B端面经初试5min1.自我介绍2.浅挖简历线上1对1的面试,就是大概问了一下简历里的项目和实习,然后就是问你能不能接受岗位调剂。复试20min1.自我介绍2.对于tob和toc的理解3.介绍一下自己和销售相关的经历4.对三棵树的了解线下终面30min1.自我介绍2.最喜欢的营销人员是谁?为什么?3.怎么看待涂料行业4.最不能接受销售行业中的那一个特性5.用一句话推销一下三棵树6.实习中和销售相关的经历7.最想去的三个工作地点————————————————————————————————————【关于我们】✅2002年成立,A股主板上市,员工人数10000+✅中国民营企业500强,建筑涂料中国第一品牌,全资及控股36家公司✅全国4大中心,14大生产基地,4大研发平台,6大研发中心✅连续多年蝉联中国年度最佳雇主【三大招聘项目】菁英计划、森计划、技术应用【八大类岗位】✅经营管理类、供应链类、技术研发类、营销业务类、信息管理类、财务管理类、行政管理类、博士类【工作地点】全国多地【衣食住行无忧】✅免费自助三餐、免费公寓、政府补贴、交通补贴、话费补贴、无忧基金、股份激励、十三大俱乐部等等【内推链接】https://wecruit.hotjob.cn/SU6173aef0bef57c4414103348/mc/position/campus?acotycoCode=mglmgz&amp;recruitType=1&amp;isLimitShowPostScope=1【内推码】&nbsp;mglmgz简历优先筛选,面试流程加快!!!
帮你内推|三棵树 校招
点赞 评论 收藏
分享
评论
1
收藏
分享

创作者周榜

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