题目描述
积木宽高相等,长度不等,每层只能放一个或拼接多个积木,每层长度相等,求最大层数,最少2层。
输入
给定积木的长度,以空格分隔,例如:3 6 6 3。
输出
如果可以搭建,返回最大层数,如果不可以返回-1。

样例输入
3 6 6 3
样例输出
3

样例输入
3 5
样例输出
-1

【分析】
设所有积木长度总和为 sum ,若可以搭建为 m 层,每层积木长度为 n ,则必有 sum = mn ;设积木中长度最大值为 max ,则必有 n >= max
所以本题只需求出积木总长度 sum ,并找出其所有大于 max 小于 sum 的因数,分别判断以此为每层长度能否成功搭建,如果可以,记录层数,最终找到最大的层数
在找每一层所要用的积木时,使用贪心策略,从大的积木开始判断

【实现】

// 判断每层为当前长度时能否拼成
function judge(width) {// 临时用于遍历的数组const temp = [...arr]// 层数let count = 0for (let i = 0; i < len; i++) {if (temp[i] === 0) {// 当前积木已被使用,跳过continue}if ((i === len - 1) && (temp[i] !== width)) {// 已找到最后一个,无法刚好拼成,返回-1,表示该长度不行return -1}// 当前层已拼的积木总长度let sum = temp[i]// 将当前积木置为0,表示已经使用temp[i] = 0if (sum === width) {// 刚好铺满该层,层数加一,向后继续count++continue} else {// 没有铺满,继续向后找for (let j = i + 1; j < len; j++) {if (temp[j] === 0) {// 积木已被使用,向后继续continue}if ((j === len - 1) && (temp[j] + sum !== width)) {// 找到最后一个了,但不能刚好拼成,返回-1return -1}if (temp[j] + sum > width) {// 当前积木超出剩余长度,不能使用continue} else if (temp[j] + sum === width) {// 加上该积木刚好铺满,以 i 位置打头的这一层已拼好,继续拼下一层temp[j] = 0count++break} else {// 加上该积木还不够sum += temp[j]temp[j] = 0continue}}}}// 可以以该长度拼成,返回此时的层数return count
}// 获取输入
const input = "3 6 6 3"const arr = input.split(" ").map(x => parseInt(x, 10)).sort((a, b) => b - a)
const len = arr.length// 最大值
const max = arr[0]
// 积木长度总和
let num = 0
for (const x of arr) {num += x
}// 最终结果:初始为-1
let res = -1// 找因数:最少两层,所以最多找到 num/2
const range = Math.floor(num / 2)
for (let i = max; i <= range; i++) {if (num % i === 0) {// i 为 num 的因数,判断每层长度为 i 能否拼成res = judge(i)}if (res !== -1) {// 要找最大层数,所以从小的长度向大的找,当找到时,不需要向后继续,直接结束break}
}console.log(res);

华为机试练习(十二)叠积木相关推荐

  1. 华为机试第十五题:HJ15 求int型正整数在内存中存储时1的个数

    华为机试第十五题:HJ15 求int型正整数在内存中存储时1的个数 一.网址链接 二.题目描述 ①描述 ②输入描述 ③输出描述 ④示例一 ⑤示例二 三.代码实现 ①Java代码实现 ②C++代码实现 ...

  2. 华为机试HJ83:二维数组操作

    作者:翟天保Steven 版权声明:著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处 题目描述: 有一个m*n大小的数据表,你会依次进行以下5种操作: 1.输入m和n,初始化m*n大 ...

  3. (牛客网)华为机试(二)

    (牛客网)华为机试题集解答 在解题前先分享一波oj刷题的固定格式代码,方便输入时使用 import java.util.*; import java.io.*; public class Main{ ...

  4. 【华为机试真题详解 Python实现】统计差异值大于相似值二元组个数【2023 Q1 | 100分】

    文章目录 前言 题目描述 输入描述 输出描述 题目解析 参考代码 前言 <华为机试真题详解>专栏含牛客网华为专栏.华为面经试题.华为OD机试真题. 如果您在准备华为的面试,期间有想了解的可 ...

  5. 【强烈推荐收藏】坚持3个月爆肝华为机试108题C++全解(适合新手入门,就业必刷套题)

    作者:翟天保Steven 版权声明:著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处 前言 金九银十,金三银四.当前正处于校招.社招的火热期,之前就想为正在筹备就业的同学们准备刷题宝 ...

  6. 【华为机试】死记硬背没思路?一般人我劝你还是算了吧

    大家好,我是哪吒. 五月份之前,如果你参加华为OD机试,收到的应该是2022Q4或2023Q1,这两个都是A卷题. 5月10日之后,很多小伙伴收到的是B卷,那么恭喜你看到本文了,抓紧刷题吧.B卷新题库 ...

  7. 华为机试在线训练--牛客网(python)第四部分

    华为机试在线训练–牛客网(python) 第四部分(31~40) 第三十一题:[中级]单词倒排 题目描述 对字符串中的所有单词进行倒排. 说明: 1.每个单词是以26个大写或小写英文字母构成: 2.非 ...

  8. (python)牛客网(华为机试四)——较难

    本博客为博主解题的部分记录,由于均为自己写的,所以答案并非最优解,有很多地方可以优化. 其他题解合集: (python)牛客网(华为机试一)--入门 (python)牛客网(华为机试二)--简单 (p ...

  9. 华为机试二星题--机器人走迷宫

    题目 机器人走一个迷宫,给出迷宫的x和y(x*y的迷宫)并且迷宫中有障碍物,输入k表示障碍物有k个,并且会将障碍物的坐标挨个输入. 机器人从0,0的位置走到x,y的位置并且只能向x,y增加的方向走,不 ...

  10. 【华为机试真题Java】从入门到入职-真题列表导读

    写在前面 本专栏有100+道题(持续更新中),都是往期的HW机试真题,根据过往同学的经验基本都会考到原题.大家有什么不懂的都可以留言. 华为机试有三道题目,第一道和第二道属于简单或中等题,分值为100 ...

最新文章

  1. 使用movetable收缩表空间
  2. html Selection
  3. memcache在项目中的应用
  4. HTML基础(2)——边框
  5. 以太坊分叉的缘由:著名的The DAO事件
  6. LAMMPS分子动力学模拟技术及应用
  7. 【经验分享】嵌入式C语言开发如何有效地排查内存泄露的疑难问题?
  8. 电脑截图怎么转换成文字?学会这个方法,轻松实现
  9. 设计心理学1-日常的设计【读书笔记】
  10. 【解决】nacos Ignore the empty nacos configuration and get it based on dataId
  11. ajax的三种传参方式
  12. 字节跳动 文林福_AI实力赋能,让汽车营销玩出抖音范
  13. 如何打开usb计算机连接网络设置,usb共享网络怎么用
  14. 【宋词】之《菩萨蛮·书江西造口壁》
  15. 目标检测系列:SSD系列SSD、FSSD、DSSD、DSOD
  16. 关于srand()与rand()函数的理解-----必看系列
  17. Ubuntu16.4加小觅深度相机实现远程视频监控
  18. 计算机网络自顶向下方法第四章笔记
  19. “玲珑杯”郑州轻工业学院第九届ACM程序设计大赛圆满结束
  20. jsp include jsp 中文乱码问题

热门文章

  1. 川大网页多媒体设计【李天翼班】资料整理
  2. HTML5中thead标签,【HTML5】table标签中thead、tbody、tfoot的作用
  3. 小强统一认证中心-部署实例
  4. python sl4a_SL4A - 随风飘落的雨滴 - 博客园
  5. 沁恒微USB蓝牙单片机CH573F初步熟悉
  6. ArcGIS 10.6 安装教程
  7. python字典内置方法_python之字典二 内置方法总结
  8. cyclone小知识(四)——利用cyclone和PS制作点云剖面图(包括画直角坐标系)
  9. xp计算机组策略怎么打开,WinXP系统打开组策略的命令是什么?
  10. 如何设置父层DIV不动子层DIIV透明且随滚动条晃动或是不晃动