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++题解) 的相关文章

随机推荐

  • 关于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