第二十八篇,C++面经之手写代码(二)

2023-05-16

第二篇以几个经典排序算法开始吧。

一、快速排序

void QuickSort(int* pArray, const int nLeft, const int nRight)
{
    if (nLeft >= nRight)
        return;
 
    int i = nLeft, j = nRight;
    int nKey = pArray[i];
 
    while (i < j)
    {
        while (i<j && pArray[j]>=nKey)
        {
            j--;
        }
        pArray[i] = pArray[j];
 
        while (i < j && pArray[i] <= nKey)
        {
            i++;
        }
        pArray[j] = pArray[i];
    }
    pArray[i] = nKey;
 
    QuickSort(pArray, nLeft, i - 1);
    QuickSort(pArray, i + 1, nRight);
}

快速排序算法要理解其分治思想,我觉得一大优点是对分治界限的选取不敏感,省去了专门找key的过程,不过也有一些对key的选取做改良的做法,可以参考看看。
选定key之后,从数据堆里把比它大的和比它小的分别扒拉出来,用“扒拉”这个接地气的词来描述,就像买土豆挑选时的动作一样,我觉得能充分体现出快排算法的精妙,你不用太精细地考虑啥时候能排完,只管找那一个个key就行,其余的水到渠成。
理解了快排的设计思想之后,背过这段代码还是相对容易的。(递归实现)

二、冒泡排序

void BubbleSort(int* pArray, const int nSize)
{
    int tmp = 0;
    for (int i = nSize-1; i > 0; i--)
    {
        for (int j = 0; j < i; j++)
        {
            if (pArray[j] > pArray[j + 1])
            {
                tmp = pArray[j];
                pArray[j] = pArray[j + 1];
                pArray[j + 1] = tmp;
            }
        }
    }
}

冒泡可以说比快排还要经典了,计算机专业的同学大一应该就学了吧。
双循环遍历,且为了避免不再对已冒出的元素再次排序,外层循环要逐次递减,每次冒出的元素都是本轮剩余元素中最大(最小)的。

三、插入排序

void InsertSort(int* pArray, const int nSize)
{
    int tmp = 0;
    for (int i = 1; i < nSize; i++)
    {
        int j = i;
        tmp = pArray[j];
        while (j > 0 && tmp < pArray[j - 1])
        {
            pArray[j] = pArray[j - 1];
            j--;
        }
        pArray[j] = tmp;
    }
}

也是双循环,内循环里先不用急着让新数据参与交换,比大小、已有数据移位、找到位置后,再直接放进去即可。
插入排序在对有序数据集中插入新元素排序的情景非常适用,笔者层发表过一篇论文,研究中值滤波算法中排序部分可提升的点,其中就用到了插入排序,效果良好。

四、数组查找问题

标题起的比较宽泛了,这一类的问题根据需求不同会衍生出各式各样的题干,后续应该还会写到这一类的题目,姑且都叫这个标题吧。
这一题的题干是这样的:一个数组中,有两个数据出现一次,其他数据都出现两次,找到这两个只出现一次的数据。

void Find2UniqueElements(std::vector<int>& array, int* num1, int* num2)
{
    std::map<int, int> map1;
    for (const auto& it : array)
    {
        map1[it]++;
    }
    
    bool ifNum1 = true;
    for (const auto& it : map1)
    {
        if (ifNum1 == true)
        {
            if (it.second == 1)
            {
                *num1 = it.first;
                ifNum1 = false;
            }
        }
        else
        {
            if (it.second == 1)
            {
                *num2 = it.first;
                break;
            }
        }
    }
}

这道题中输入数组可以用std::vector,后两个输入指针用来返回找到的两个数据。
思路是借用std::map数据结构,key为数组中出现的各个元素,value为响应的出现次数,照此生成std::map后,遍历map,找到两个计数为1的key即可。

五、字符串匹配算法

int KMP(std::string s, std::string t)
{
    int i = 0, j = -1;
    int slen = s.length(), tlen = t.length();
    std::vector<int> next;
    next.resize(tlen);

    while (i < tlen)
    {
        if (j == -1 || t[i] == t[j])
        {
            i++;
            j++;
            next[i] = j;
        }
        else
        {
            j = next[j];
        }
    }

    i = 0; j = 0;
    while (i < slen && j < tlen)
    {
        if (j == -1 || s[i] == t[j])
        {
            i++;
            j++;
        }
        else
        {
            j = next[j];
        }
    }

    if (j == tlen)
        return i - j;
    else
        return -1;
}

本来不好意思写KMP,背又背不过,理解又理解不了,但想来想去还是写一下吧,哪怕当做个记录也好,万一以后用得着。
输入s为源字符串,t为目标字符串,若匹配成功返回首字母在s中的index,若匹配不成功返回-1。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

第二十八篇,C++面经之手写代码(二) 的相关文章

  • 循环链表的实现

    循环链表的实现 说明 参考资料 传智播客扫地僧的数据结构教学视频 线性表基本知识 参考 该实现的说明 C语言实现基于单向链表 xff0c 参考实现算法和数据的分离 实现 circular list h span class token ma
  • Ubuntu20.04安装与配置记录

    Ubuntu20 04安装与配置记录 原文地址 xff1a Ubuntu20 04安装与配置记录 一 Ubuntu系统盘制作 1 1 Windows环境下制作系统盘 下载Ubuntu系统 xff0c 选择桌面版 下载工具系统盘制作工具Ruf
  • C++单例写法记录

    C 43 43 单例写法记录 源码地址 一 饿汉式 1 1 静态指针 静态垃圾回收类 instance h ifndef INSTANCE H define INSTANCE H include lt string gt include l
  • 堆栈应用:表达式求值(C语言)

    文章目录 堆栈应用 xff1a 表达式求值 xff08 C语言 xff09 两个定义大致过程具体代码 堆栈应用 xff1a 表达式求值 xff08 C语言 xff09 两个定义 中缀表达式 xff1a 运算符号位于两个运算数之间 如 xff
  • andrsoid studio 长期编辑

    andrsoid studio 2020 02 08 修改build gradle配置 Top level build file where you can add configuration options common to all s
  • 使用 Maven 搭建 Mybatis 环境

    一 创建项目 1 点击 File gt New gt Module 2 选择左侧的 Maven xff0c 由于只是创建一个普通的项目 xff0c 此处点击 Next 即可 3 输入 GroupId 和 ArtifactId 4 配置 ma
  • ubuntu安装npm命令

    ubuntu安装npm命令 摘要 xff1a npm全称Node Package Manager xff0c 是node的包管理工具 xff0c 是用JavaScript写出来的工具 xff0c 被内置进了node中 xff0c 是随同No
  • zynq操作系统: Linux驱动开发AXIDMA篇

    前言 由于bram形式的速率限制 xff0c 在同样紧急的时间条件下 xff0c 还是改回了axidma的方式来降维打击 xff0c 对于几兆的速率 xff0c 颇有种杀鸡用牛刀的感觉 xff0c 没办法 xff0c 原来的刀就是差一点 x
  • C# 对RabbitMQ使用

    1 安装NuGet包RabbitMQ Client 2 生产者 确认机制 1 含义 xff1a 就是应答模式 xff0c 生产者发送一条消息之后 xff0c Rabbitmq服务器做了个响应 xff0c 表示收到了 2 特点 xff1a 异
  • CSS—— grid 网格布局

    文章目录 1 grid 网格布局 1 grid 网格布局 display gridgrid 属性是以下属性的简写属性 默认 grid gap xff0c none xff0c 200px 网格之间的距离grid template rows
  • 【图文解析】给定一个链表,判断链表中是否有环

    目录 例题描述解题思路代码实现 例题描述 给定一个链表 xff0c 判断链表中是否有环 为了表示给定链表中的环 xff0c 我们使用整数 pos 来表示链表尾连接到链表中的位置 xff08 索引从 0 开始 xff09 如果 pos 是 1
  • Centos7执行yum install *时出现“Peer‘s Certificate has expired.“

    一 引言 今天在安装OpenResty的时候 xff0c 出现了 34 Peer 39 s Certificate has expired 34 的问题 xff0c 详细错误如下 xff1a root 64 kubernetes sudo
  • git常用指令

    1 查看分支创建来源 指令 xff1a git reflog show 分支名 由图可以看出a分支是由master创建出来的 2 查看分支情况 查看远程分支 指令 xff1a git branch r 查看所有分支 指令 xff1a git
  • 利其器(2)——idea常用配置_提高开发效率

    文章目录 简介编码设置设置idea支持生成唯一序列化id全字母代码提示调出Run Dashboard显示方法分隔符忽略大小写提示自动导入包单行显示多个Tabs设置鼠标滚轮 43 96 ctrl 96 修改字体大小设置保存自动格式化等配置终端
  • 换硬币问题

    编写程序实现用一元人民币换成一分 xff0c 两分 xff0c 五分的硬币共50枚 三重循环 include lt stdio h gt int main int x y z x y z 分别表示一分 两分 五分的个数 for x 61 0
  • 最新ubuntu22.04 下列软件包有未满足的依赖关系 解决方案--------------------------------------------------记因为配环境而耽误的一天

    今天真的崩溃一整天了 xff0c 一直一直都在找错一直一直都在找解决方案 xff0c 我发现VM真的超多超多BUG的 xff0c 感兴趣的话可以跟我聊聊 当然这篇讲的主要不是这些BUG xff0c 而是依赖关系 如果你出现类似的情况 xff
  • python获取当前执行py文件的绝对路径

    python获取当前执行py文件的绝对路径 python3 home appuser test py span class token comment 获取当前执行py文件的绝对路径 span py file path span class
  • 【iOS】NSAttributedString 相关

    1 富文本的相关属性字段 NSAttributedString Key xff08 1 xff09 paragraphStyle span class token keyword let span paraStyle span class
  • python奇技淫巧:命令行输出漂亮的表格

    前言 最近想着用 Python写一个命令行的管理各种资源的信息的管理工具 xff0c 比如阿里云的ECS等信息 xff0c 基本的功能就是同步阿里云的资源的信息到数据库 xff0c 然后可以使用命令行查询 展现信息在命令行中的 xff0c
  • Android_基础_String资源带参数

    转载自 https www cnblogs com leelugen p 6685905 html Android 基础 String资源带参数 在android 开发 xff0c 我们通常会用string xml资源去设置textview

随机推荐

  • es6 — class 类,原型,原型链

    文章目录 1 意义2 语法1 由来2 constructor 3 类实例3 1 使用new 调用3 2类的继承 4 新写法5 取值函数 getter 存值函数 setter 2 原型以及原型链1 原型2 原型链3 instanceof 1
  • SQLServer注释快捷键

    SQLServer中的批量注释 批量注释批量取消注释 批量注释 Ctrl 43 K C 按住Ctrl键不放 然后依次按下K和C 批量取消注释 Ctrl 43 K U 按住Ctrl键不放 然后依次按下K和U
  • 【面试宝典】软件测试工程师2021烫手精华版(第一章测试理论篇)

    前言 xff1a 翻了很多论坛博客关于面试的文章 xff0c 很多都是不完整的 xff0c 还都是比较常见规规矩矩的 xff0c 那大家刷过的基本都不拿出来了 xff0c 都是一些大家平时见得不多 xff0c 但是面试官很看中的一些题 第一
  • uniapp package.json和mainfest.json,如何区分环境变量

    uniapp在hbuilder中 xff0c 导航的运行就是development xff0c 发行就是production package json 如果是往服务器上发布版本 xff0c 则是打包成zip在服务器上解压 xff0c 但注意
  • VSCode扩展时出错XHRfaile问题解决

    问题 VScode扩展插件链接网络失败XHR faile错误 解决办法 1 第一步 xff1a 文件 gt 首选项 gt 设置 gt 如下图 xff1a 2 第二步 xff1a 用户 gt 应用程序 gt 代理服务器 gt 如下图操作 xf
  • HDFS的启动流程和HA

    HDFS的启动流程 当 NameNode 启动时HDFS首先将Fsimage读入内存对元数据进行恢复 xff0c 然后再读edits文件中的更新操作在恢复后的元数据上进行执行 xff0c 使得此时的NameNode中保存的是停止前的最新状态
  • 『XXG笔记』Github pages 自定义域名

    x1f44b 本文章为我 XXG 原创 xff0c 由于个人能力有限 xff0c 此笔记可能会错漏 过时 或需要补充 x1f4d6 笔记文章由于多平台发布 xff0c 为了修改方便 xff0c 可以参观我的博客 xff1a https xx
  • 第十八篇,Simulink with Git

    一 综述 本篇以MATLAB R2021b为基础讲解如何对Simulink模型做Git管理 xff0c mdl与slx均可 Git并非只能对手写代码做版本管理 xff0c 它的应用十分广泛 xff0c 囊括了各种使用编程语言编写的代码 脚本
  • 第十九篇,解析法求解五阶多项式

    x0为初始约束 xff0c 时间为0 xff1b x1为结束约束 xff0c 时间为t coef 为求解结果 xff0c 定义x 61 at 5 43 bt 4 43 ct 3 43 dt 2 43 et 43 f xff0c 则coef
  • 第二十篇,Simulink使用痛点记录

    在工作实践中发现了MATLAB amp amp Simulink一些虽不致项目失败但的确很不方便的点 xff0c 记录下来以备持续研究 xff0c 并做分享 xff1b 都是个人认为比较基础的能力或者容易做到的特性 xff0c MATLAB
  • 第七篇(下),MPC工程化总结

    目录 一 引言 二 MPC的理解与实现 2 1 模型设计与实现 2 2 MPC工程实现步骤 三 参考资料 3 1 基础理论 3 2 Refer to Apollo 3 3 其它实例参考 3 4 MATLAB中的MPC 四 demo代码 一
  • es6 -- 解构赋值

    文章目录 1 数组的解构赋值 xff0c 按次序排列 xff0c 位置决定2 对象的解构赋值 xff0c 没有次序 xff0c 变量与属性同名即可取值 默认undefined3 字符串的解构赋值4 数值和布尔值的结构赋值5 函数结构赋值 被
  • 第二十一篇,常用Git操作记录

    一 拉取远程分支 拉取远程名叫dev的分支 git fetch origin dev 执行后本地git branch并不能看到dev git checkout dev 可以看到dev了 xff0c 在dev上开发 二 本地新建分支推送到远程
  • 第二十二篇,C++面经之问答(一)

    目录 一 传引用有没有拷贝 二 引用和指针的区别 三 构造 析构函数中可不可以调用虚函数 四 怎样区分继承和组合 五 多态的实现原理 虚表虚指针 六 用过哪些设计模式 6 1状态模式 6 2享元模式 6 3单例模式 6 4工厂模式 6 5观
  • 第二十三篇,C++面经之问答(二)

    目录 一 lambda表达式的应用场景 二 lambda表达式传引用有什么坑 三 C 43 43 为什么引入线程的语言级支持 四 如何优雅地关闭一个阻塞中的线程 五 线程不做join 或detach 会有什么问题 六 多线程同步 xff0c
  • 第二十四篇,C++面经之问答(三)

    目录 一 TCP UDP的区别 应用场景 二 UDP里client server使用的过程 三 TCP端口复用问题 四 TCP三次握手 五 TCP四次挥手 六 Qt信号槽的连接方式 七 一个信号连接多个槽时 xff0c 槽函数的调用顺序 八
  • 第二十五篇,C++面经之问答(四)

    目录 一 std string是深拷贝还是浅拷贝 xff0c 深拷贝与浅拷贝的区别 二 string vector等容器中 xff0c size和capacity的区别 三 vector和list的区别 map和set的区别 四 STL中的
  • 第二十六篇,C++面经之问答(五)

    一 new delete和malloc free的区别 new delete是C 43 43 的关键字 操作符 xff0c malloc free是C的函数 xff0c 需引入 lt stdlib h gt new会调用构造函数会初始化并返
  • 第二十七篇,C++面经之手写代码(一)

    前几篇整理 记录了面试遇到的问答题目 xff0c 接下来再开几篇 xff0c 写一写手写代码环节的题目 xff0c 尽量加上注释或者讲解 xff0c 并把代码写完整 xff0c 达到复制粘贴后可立即编译执行的程度 语言还是C 43 43 x
  • 第二十八篇,C++面经之手写代码(二)

    第二篇以几个经典排序算法开始吧 一 快速排序 span class token keyword void span span class token function QuickSort span span class token punc