2023.6.3 华为机试题小记(附c++题解)

2023-11-11

导语

   机试一共三个题。分为两个基础题和一个进阶题。两个基础题各100分,进阶题200分,总计400分。

进阶题 堆积木(200分)

  • 有一堆长方体积木,他们的宽度和高度都相同,但长度不一。
  • 小橙想把这堆积木叠成一面墙,墙的每层可以放一个积木,也可以将两个积木拼起来,要求每层的长度相同。
  • 若必须用完这些积木,叠成的墙最多为多少层?
  • 如下是叠成一面墙的图示,积木仅按宽和高所在的面进行拼接。(图这里没法找到)
  • 输入描述:
  • 输入为一行,为各个积木的长度,数字为正整数,并由空格分隔。积木的数量和长度都不超过5000.
  • 输出描述:
  • 输出一个数字,为强的最大层数,如果无法按要求叠成每层长度一致的墙,则输出-1。
  • 示例1:
  • 输入
  • 3 6 6 3
  • 输出
  • 3
  • 说明
  • 可以每层都是长度3和6的积木拼接起来,这样每层的长度为9,层数为2;
  • 也可以其中两层直接用长度6的积木,两个长度3的积木拼接为一层,这样层数为3,故输出3
  • 示例2:
  • 输入
  • 1 4 2 3 6
  • 输出
  • -1
  • 说明
  • 无法用这些积木叠成每层长度一致的墙,故输出-1。

思路

   感觉这个200的题也没有比100分的题目难。我个人的思路是: 首先搭积木的每一层的长度越小,那么层高就越大。并且层高就能与数组所有元素之和/每一层的长度。
   所以我们可以按照每一层积木的长度(layer_length)从小向大进行遍历,判断是否能按照当前层的长度为layer_length搭好积木,如果可以的话,就找到了最优解: sum / layer_length, 否则layer_length ++,继续判断。如果遍历结束都无法满足条件,说明无法用这些积木叠成每层长度一致的墙,故输出-1。
   所以问题就被拆分成了更小的问题:如果判断是否能够按照layer_length的长度来搭建好积木呢?假设我们实现一个函数canSum。这个函数的作用是判断在数组中取元素,是否可以组成target,如果可以组成target,就在数组中移除这些元素,并返回true,否则返回false。 有了这个canSum函数,那么就很容一可以判断是否能够按照layer_length的长度来搭建好积木呢。因为我们每一次调用canSum其实就是搭建了一层积木,如果搭建成功,我们继续搭建,直到数组中没有元素了,就说明可以完成搭建,否则说明当前无法按照layer_length进行搭建。 分析至此,问题就很简单了。 剩下一些细节问题会写在代码注释中。

代码

bool canSum(vector<int> &nums, int target, int index) {
  if (target == 0)
    return true;
  if (target < 0)
    return false;

  int remainder = target;
  for (int i = index; i < nums.size(); i++) {
    if (canSum(nums, target, i + 1)) {
      return true;     //不取当前位置上的元素nums[i]
    } else if (canSum(nums, target - nums[i], i + 1)) {  //取到nums[i]
      nums.erase(nums.begin() + i);
      return true;
      }
    }
  return false;
}

int main() {
  std::vector<int> bricks;
  int length;
  // 从控制台获取输入数组
  while (cin>>length) {
    bricks.push_back(length);
    if (getchar() == '\n') break;
  }

  // 获取所有砖块长度和
  int sum = 0;
  for (int brick : bricks) {
    sum += brick;
  }


  //layer_length从1开始遍历
  for (int layer_length = 1; layer_length <=sum; layer_length++) {
    //剪枝:如果sum都不是layer_length的整数倍,那么肯定无法拼成的
    if (sum % layer_length == 0) {
      //核心代码通过循环调用canSum,来判断是否能够以当前layer_length搭成
      vector<int> temp = bricks;
      while (canSum(temp, layer_length,0)) {
        continue;
      }
      if (temp.empty()) {
        //可以搭成,直接返回层的个数。
        int target_layers = sum / layer_length;
        cout << target_layers << endl;
        return target_layers;
      }
    }
  }
  //遍历结束都没找到可以搭成的layer_length,说明无法用这些积木叠成每层长度一致的墙,故输出-1
  cout << -1;
  return -1;
}

基础题一 寻找最后一个匹配子序列的下标(100分)

   题目描述忘了,在网上没找到匹配的。自己描述下。
   给定两个string类型输入target和source。判断source中存在一个子序列等于target吗?如果存在,返回这个子序列的第一个下标。注意有多个子序列满足的时候返回最大的下标。如果不存在,返回-1。
   举个栗子: source = “aebceaebc”, target = “abc”。 那么source中有两个子序列可以满足条件index[0] + index[2] + index[3]组成的abc子序列和index[5] +index[7] +index[8]组成的子序列,那么要返回下标较大的子序列的第一个下标也就是5。

思路

  思路的话,遍历source。每一次遍历,就判断source中当前位置开头的字符串是否能够找到一个子序列等于target,如果可以就记录下这个位置。遍历完source后,返回这个位置即可。这个位置的初始值赋值为-1,因为如果遍历完都没找到对应的target的话,说明找不到指定case,所以返回-1。
   那么如何判断以当前位置开头的字符串中是否能找到一个子序列等于target呢? 首先就用两个指针,一个指针指source,一个指target,如果两个值相同,他们同时向后移动,否则就将source向后移动。只要target的指针指向了target最后一个元素的下一个元素,说明所有匹配完成了,找到了对应子串,否则说明没找到。 更多细节写在代码中。(只过了85%)
  

代码

  

int main() {
  string target;
  string source ;
  //获取输入字符串
  getline(cin, target);
  getline(cin, source);
  int last_position = -1;
  int target_len = target.length();
  int source_len = source.length();

  for (int i = 0; i <= source_len - target_len; i++) {
    int index = 0;
    //判断source中以i开头的子串中能否有子序列匹配到target
    for (int j = 0; i + j < source_len && index<=target_len; j++) {
      if (source[i + j] != target[index]) {
        continue;
      } else {
        index++;
      }
    }
    //匹配完成,更新last_position
    if (index == target_len) {
      last_position = i;
    }
  }
  cout<< last_position;
}

基础题二 种植白杨树(100分)

题目描述
近些年来,我国防沙治沙取得显著成果。某沙漠新种植N棵胡杨(编号1-N),排成一排。

一个月后,有M棵胡杨未能成活。

现可补种胡杨K棵,请问如何补种(只能补种,不能新种),可以得到最多的连续胡杨树?

输入描述

N 总种植数量
M 未成活胡杨数量
M 个空格分隔的数,按编号从小到大排列
K 最多可以补种的数量

其中:
1 <= N <= 100000
1 <= M <= N
0 <= K <= M

输出描述

最多的连续胡杨棵树

思路

   没写出来,留空。。

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

2023.6.3 华为机试题小记(附c++题解) 的相关文章

  • 使用链表进行堆排序

    我想知道是否有人曾经使用链表进行堆排序 如果他们可以提供代码 我已经能够使用数组进行堆排序 但尝试在链表中进行排序似乎不切实际 而且在你知道的地方很痛苦 我必须为我正在做的项目实现链接列表 任何帮助将不胜感激 我也用C 答案是 你不想在链表
  • 如何从字符串中提取子字符串直到遇到第二个空格?

    我有一个像这样的字符串 o1 1232 5467 1232 5467 1232 5467 1232 5467 1232 5467 1232 5467 如何仅提取 o1 1232 5467 要提取的字符数并不总是相同 因此 我只想提取直到遇到
  • 是否需要销毁运算符删除的形式才能真正销毁对象?

    C 20 添加了破坏形式operator delete区别于std destroying delete t范围 它导致delete表达式在调用之前不再销毁对象operator delete 目的是在显式调用对象的析构函数和释放内存之前 允许
  • 使用 ADAL v3 使用 ClientID 对 Dynamics 365 进行身份验证

    我正在尝试对我们的在线 Dynamics CRM 进行身份验证以使用可用的 API 我能找到的唯一关于执行此操作的官方文档是 https learn microsoft com en us dynamics365 customer enga
  • EntityHydrate 任务失败

    我最近安装了 Visual Studio 11 Beta 和 Visual Studio 2010 之后 我无法在 Visual Studio 2010 中构建依赖于 PostSharp 的项目 因此我卸载了 Visual Studio 1
  • C# 中一次性对象克隆会导致内存泄漏吗?

    检查这个代码 class someclass IDisposable private Bitmap imageObject public void ImageCrop int X int Y int W int H imageObject
  • Android NDK 代码中的 SIGILL

    我在市场上有一个 NDK 应用程序 并获得了有关以下内容的本机崩溃报告 SIGILL信号 我使用 Google Breakpad 生成本机崩溃报告 以下是详细信息 我的应用程序是为armeabi v7a with霓虹灯支持 它在 NVIDI
  • JavaScript 错误:MVC2 视图中的条件编译已关闭

    我试图在 MVC2 视图页面中单击时调用 JavaScript 函数 a href Select a JavaScript 函数 function SelectBenefit id code alert id alert code 这里 b
  • 如何在 Javascript 中连接 C# ActiveX 事件处理程序

    我尝试使用几个代码片段将 ActiveX 对象与 Javascript 事件处理程序挂钩 我无法确定为什么事件处理程序没有被调用 带有项目的 Github 存储库 https github com JesseKPhillips Csharp
  • MySQL 连接器 C++ 64 位在 Visual Studio 2012 中从源代码构建

    我正在尝试建立mySQL 连接器 C 从源头在视觉工作室2012为了64 bit建筑学 我知道这取决于一些boost头文件和C 连接器 跑步CMake生成一个项目文件 但该项目文件无法编译 因为有一大堆非常令人困惑的错误 这些错误可能与包含
  • SQLAPI++ 的免费替代品? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 是否有任何免费 也许是开源 的替代品SQLAPI http www sqlapi com 这个库看起来
  • 使用 gcc 时在头文件中查找定义的好方法是什么?

    在使用 gcc 时 有人有推荐的方法在头文件中查找定义吗 使用 MSVC 时 我只需右键单击并选择 转到定义 这非常好 我使用过 netbeans gcc 它确实有代码帮助 包括到定义的超链接 所以这是一种选择 但是 我想知道是否有任何其他
  • C:设置变量范围内所有位的最有效方法

    让我们来int举个例子 int SetBitWithinRange const unsigned from const unsigned to To be implemented SetBitWithinRange应该返回一个int其中所有
  • 如何从 Windows Phone 7 模拟器获取数据

    我有一个 WP7 的单元测试框架 它在手机上运行 结果相当难以阅读 因此我将它们写入 XDocument 我的问题是 如何才能将这个 XML 文件从手机上移到我的桌面上 以便我可以实际分析结果 到目前为止 我所做的是将 Debugger B
  • 任何人都可以清楚地告诉如何在不使用像 这样的预定义函数的情况下找到带有小数值或小数值的指数吗? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 例如 2 0 5 1 414 所以想要 我是 c 的新手 所以请解释简单的逻辑 如果不是复杂的逻辑也足够了 在数学中 从整数取幂到实数
  • 如果将变量设置为等于新对象,旧对象会发生什么?

    假设我们有一个 X 类not有一个超载的operator 功能 class X int n X n 0 X int n n n int main X a 1 an object gets constructed here more code
  • winform c# 中的弹出窗口

    我正在开发一个需要弹出窗口的项目 但问题是我还希望能够通过表单设计器在此弹出窗口中添加文本框等 所以基本上我有一个按钮 当您单击它时 它将打开我在表单设计器中设计的另一个窗口 我一直在谷歌搜索 但还没有找到我需要的东西 所以我希望你们能帮助
  • 从后面的代码添加外部 css 文件

    我有一个 CSS 文件 例如 SomeStyle css 我是否可以将此样式表文档从其代码隐藏应用到 aspx 页面 您可以将文字控件添加到标头控件中 Page Header Controls Add new System Web UI L
  • 声明一个负长度的数组

    当创建负长度数组时 C 中会发生什么 例如 int n 35 int testArray n for int i 0 i lt 10 i testArray i i 1 这段代码将编译 并且启用 Wall 时不会出现警告 并且似乎您可以分配
  • 如何为有时异步的操作创建和实现接口

    假设我有数百个类 它们使用 计算 方法实现公共接口 一些类将执行异步 例如读取文件 而实现相同接口的其他类将执行同步代码 例如将两个数字相加 为了维护和性能 对此进行编码的好方法是什么 到目前为止我读到的帖子总是建议将异步 等待方法冒泡给调

随机推荐

  • 关于qt 读写结构体

    目录 前言 一 注意事项 1 1 需求 1 2 读文件报错 1 2 1 文件写入 1 2 2 文件读取 1 2 3 文件写入 1 2 4 文件读取 二 解决方案 2 1 正确实例代码 2 1 1 头文件 2 1 2 源文件 2 1 3 文件
  • 响应式布局的常用解决方案对比(媒体查询、百分比、rem和vw/vh)

    简要介绍 前端开发中 静态网页通常需要适应不同分辨率的设备 常用的自适应解决方案包括媒体查询 百分比 rem和vw vh等 本文从px单位出发 分析了px在移动端布局中的不足 接着介绍了几种不同的自适应解决方案 本文原文在我的github主
  • 【粉丝问答9】一起入职的同事能力不如我,只因学历比我高,工资是我的两倍

    一起入职的同事能力不如我 只因学历比我高 工资是我的两倍 我想这是很多初入职场的同学经常会遇到的一个问题 本篇只针对研发人员 一口君有个朋友C君刚毕业的第一家 也遇到过类似的问题 C君是本科进入做路由器的协议开发工作 辛辛苦苦开发的软件模块
  • Linux Sed命令详解

    概述 sed是stream editor的简称 也就是流编辑器 它一次处理一行内容 处理时 把当前处理的行存储在临时缓冲区中 称为 pattern space 接着用sed命令处理缓冲区中的内容 处理完成后 把缓冲区的内容送往屏幕 接着处理
  • KITTI数据集解析

    KITTI 数据集解析 本文主要是对于3D目标检测中 KITTI数据集的分析 数据下载 KITTI 官网链接 下载的主要有 left color images velodyne point clouds camera calibration
  • 云备份项目

    云备份项目 1 云备份认识 自动将本地计算机上指定文件夹中需要备份的文件上传备份到服务器中 并且能够随时通过浏览器进行查看并且下载 其中下载过程支持断点续传功能 而服务器也会对上传文件进行热点管理 将非热点文件进行压缩存储 节省磁盘空间 2
  • 数据结构--回顾数据结构基本概念、数据结构三要素

    目录 什么是数据 数据元素 什么是数据对象 什么是数据结构 数据结构的三要素 逻辑结构 1 集合 2 线性结构 编辑 3 树形结构 4 图结构 数据的运算 物理结构 也叫做存储结构 1 顺序存储 2 链式存储 3 索引存储 借助索引表 4
  • CMOS芯片制造全工艺流程(后端基础第一篇)

    芯片制造全工艺流程详情 我们每天运行程序的芯片是这样造出来的 放大后的芯片机构 无与伦比的美 在如此微观世界 人类科技之巅 芯片一般是指集成电路的载体 也是集成电路经过设计 制造 封装 测试后的结果 通常是一个可以立即使用的独立的整体 如果
  • Windows7下安装docker记录

    docker火了也那么好几年了 偶才开始学习docker 说来真是落后主潮流太久 不过落后有落后的好处 因为大多数的坑都已经有人填过 所以遇见问题解决问题那也是相当的迅速 但就算是相当的迅速 这windows7下安装docker 也花了我大
  • java 算数

    public class Arith 提供精确加法计算的add方法 param value1 被加数 param value2 加数 return 两个参数的和 public static double add double value1
  • Spring cloud系列十五 使用线程池优化feign的http请求组件

    1 概述 在默认情况下 spring cloud feign在进行各个子服务之间的调用时 http组件使用的是jdk的HttpURLConnection 没有使用线程池 本文先从源码分析feign的http组件对象生成的过程 然后通过为fe
  • 深入理解web安全攻防策略

    前言 互联网时代 数据安全与个人隐私信息等受到极大的威胁和挑战 本文将以几种常见的攻击以及防御方法展开分析 1 XSS 跨站脚本攻击 定义 通过存在安全漏洞的Web网站注册用户的浏览器内运行非法的HTML标签或JavaScript进行的一种
  • VS视图菜单中找不到服务器资源管理器怎么办?

    http www cnblogs com SissyNong archive 2011 06 18 1981970 html 前几天同事安装了VS2010后 发现视图菜单中根本就没有服务器管理器这一项 如果想打开服务器管理器 都要使用快捷键
  • 区块链共识算法的发展现状与展望

    区块链共识算法的发展现状与展望 袁勇等 1 传统分布式一致性算法 2 主流区块链共识算法 3 共识算法的模型与分类 4 区块链共识算法的新进展 4 1 主线 1 PoW 与 PoS 算法的有机结合 4 2 主线 2 原生 PoS 算法的改进
  • 翻转数组

    题目描述 给定一个长度为n的整数数组a 元素均不相同 问数组是否存在这样一个片段 只将该片段翻转就可以使整个数组升序排列 其中数组片段 l r 表示序列a l a l 1 a r 原始数组为 a 1 a 2 a l 2 a l 1 a l
  • 数据挖掘顶级比赛---综合整理

    整理所有可以参加的数据挖掘顶级比赛 1 DrivenData https www drivendata org 2 CrowdANALYTIX https www crowdanalytix com solutions community
  • loss-FSCE 小样本识别

    FSCE Few Shot Object Detection via Contrastive Proposal Encoding 以Faster RCNN 作为小样本目标检测的基本框架 采用两阶段的训练方法 第一阶段的训练集是大量标注的基本
  • OpenCV4 视频目标检测 场景文本检测 手写数字识别 案例

    转载 一直想找本书 能在机器学习复杂的算法原理和高效的编程实战之间达到合适的平衡 让感兴趣的同学拿到就有能用的代码 还有基本原理的介绍 因为了解原理才知道什么时候用什么算法最合适 以及如何调整参数 一直没找到合适的 所以动手写了一本 p 拖
  • 片内外设、片上外设和片外外设的区别

    片内外设就是片上外设 同一种意思不同说法而已 片内外设和片外外设的区别 片内 外设是两个概念 片内指做成芯片的集成电路内部 简称片内 片外同理显而易见 外设是外部设备的简称 是指集成电路芯片外部的设备 集成电路芯片与外部设备的连接一般需要专
  • 2023.6.3 华为机试题小记(附c++题解)

    华为机试小记 导语 进阶题 堆积木 200分 思路 代码 基础题一 寻找最后一个匹配子序列的下标 100分 思路 代码 基础题二 种植白杨树 100分 思路 导语 机试一共三个题 分为两个基础题和一个进阶题 两个基础题各100分 进阶题20