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

2023-05-16

前几篇整理、记录了面试遇到的问答题目,接下来再开几篇,写一写手写代码环节的题目,尽量加上注释或者讲解,并把代码写完整,达到复制粘贴后可立即编译执行的程度。
语言还是C++,有一点需要说明一下,有些面试官要求做安全检查,比如传入的指针是否为空,传入的int值是否超出设定的范围,但大部分不强制要求,关键看设计思路,所以我贴上的代码里有的做这种检查有的没做,知晓这层意思就好。
每篇的数量就先不做限制了,主要控制篇幅吧,毕竟这种题目长短差别很大。

一、判断回文字符串

bool func(const char* str) // 回文
{
    if (str == nullptr || strlen(str) == 0)
        return false;
 
    int nLen = strlen(str);
    for (int i = 0, j = nLen - 1; i <= j; ++i, --j)
    {
        if (str[i] == str[j])
            continue;
        else
            return false;
    }
 
    return true;
}

这个没啥太多好说的,也是比较经典的题目,两头双向奔赴就好。

二、合并两个有序数组

void func1(int a[], int b[], const int m, const int n) // 合并两个有序数组
{
    int i = m-1, j = n-1;
    int k = m + n - 1;
 
    while (i >= 0 && j >= 0)
    {
        a[k--] = (a[i] > b[j]) ? a[i--] : b[j--];
    }
 
    while (j >= 0)
    {
        a[k--] = b[j--];
    }
}

数组a和b是已经排好序了的并且排序方式相同,m、n分别是a、b中的元素个数,但互相大小未知,不过m不是数组a的全部length,因为要把合并后的结果放在a中,认为a的长度足够大。
这道题有几个注意点:

  1. 覆盖问题,索引k的设计要找好位置,不能让合并后的新数据覆盖了原a中尚未参与合并排序的元素;
  2. 第一个while()循环结束后,假如i未减到0,即原a未遍历完,此时b已遍历完并完成合并,由于合并结果仍然写到a中,a剩余的元素也是符合排序规则的,因此它们就不用动了,无需增加额外操作;
  3. 第一个while()循环结束后,假如j未减到0,则a遍历完了b没遍历完,说明b的剩余元素应放到合并后的末尾,所以增加了一道while()循环把它们放到a里去。

三、用两个栈结构实现FIFO队列

#include <stack>
using namespace std;
 
void push(int num) // 用两个栈结构实现FIFO队列
{
    stack1.push(num);
}
 
int pop()
{
    if (stack2.empty() == true)
    {
        while (stack1.empty() == false)
        {
            stack2.push(stack1.top());
            stack1.pop();
        }            
    }
 
    int ret = stack2.top();
    stack2.pop();
    return ret;
}

FIFO即先入先出,First In First Out;队列要实现入队和出对两个方法,我们把它定义为push()和pop();栈结构直接用C++标准的stack,两个栈结构简单起名stack1、stack2。
栈是典型的FILO先入后出数据结构,题干的立意是用两个栈结构实现FIFO,自然想到这就免不了要在两个栈之间倒换数据。
入队push()操作就比较简单了,没有太多要求,只管加入即可,因此我们用stack1承接push()方法,如代码中所示,很简单不再赘述;关键的是出队pop(),得准确无误地找到最先入队的那个,并在栈中删除它的记录,而且不能扰乱其它元素的顺序,这时第二个栈结构的重要作用就显现出来了。
先设想只有一个栈结构该怎么做pop()呢?把所有元素弹出来,放到一个vector或者什么里,然后舍弃最早的那个把剩余的再按原顺序压栈回去,这样做是能做,但一方面违背了题目对可用数据结构的约束,即只能用栈;另一方面方法太笨,体现不出软件设计的精妙。
而再用一个栈就完美解决了,就像左手倒右手一样,把stack1里的弹出压栈到stack2里,正好反转了stack1中的整体顺序但又保持了元素间的相对顺序,stack2栈顶元素即为最早入队者,直接把它返回并pop()即可;pop()之后不用再倒回stack1,留在stack2里供后续继续pop();仅在pop()时发现stack2为空需要把stack1全部倒入stack2。
简便、巧妙!

四、斐波那契数列问题

// 递归写法
int fibonacci(const int n)
{
    if (n <= 0)
        return 0;
    else if (n == 1)
        return 1;
    else
        return fibonacci(n-1) + fibonacci(n-2);
}
 
// 非递归写法
int fibonacci(const int n)
{
    if (n <= 0)
        return 0;
    else if (n == 1)
        return 1;
    else
    {
        int add1=0, add2=1, result=1;
        int i = 2;
        while (i <= n)
        {
            result = add1 + add2;
            add1 = add2;
            add2 = result;
            ++i;
        }
 
        return result;
    }
}

兔子繁衍问题、青蛙跳台阶问题,均可归纳抽象为斐波那契数列问题,斐波那契数列与自然之美吻合,即黄金分割。
斐波那契数列问题一般有递归写法和非递归写法。

五、走棋盘格问题

int func(const int n, const int m) // n横向,m纵向
{
    if (n <= 0 || m <= 0)
        return 1;
    else if (n == 1 || m == 1)                         //单边的
        return n + m;
    else
    {
        return func(n - 1, m) + func(n, m - 1);   //常规,递归,横向减一个纵向减一个
    }
}

走棋盘格问题和斐波那契数列有点儿相似,但难度更大一点。
问题描述是这样的:围棋的棋盘是有行列的,我们将其坐标化,假定某一个角为原点(0, 0),每走一行或一列为一步,不许往回走,问走到(n, m)有多少种走法?
这道题的思路也是递归,考虑每个点从其前一个点的到达方式即可。分析题干约束,每个点的到达方式其实只会有两种,一是前一个点与其行数相同列数减1,一是前一个点与其列数相同行数减1,然后一步到达;如此递归地往回推导,最终可回到显而易见的初始位置或者易得出结果的特殊位置。
特殊位置比如代码中第二个条件分支,即棋盘行或列坐标为1的点,从原点到达的走法为n+m种,草稿纸上一画便知。
递归题一般会有非递归解法,可尝试动手写一写。

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

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

  • 表排序

    文章目录 表排序 表排序 思想 当待排数组中的元素不是简简单单的整数 xff0c 而是复杂的结构体 xff0c 那么移动元素所花费的时间就不能忽略不计了 xff0c 这时候我们要减少元素之间移动的次数了 表排序就是这么一个排序 xff0c
  • 循环链表的实现

    循环链表的实现 说明 参考资料 传智播客扫地僧的数据结构教学视频 线性表基本知识 参考 该实现的说明 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