华为OD机试 - 叠积木1 - 双指针(Java 2023 B卷 200分)

news/2024/7/20 18:21:43 标签: 华为od, java, 七日集训, 学习, 送书

在这里插入图片描述

目录

    • 专栏导读
    • 一、题目描述
    • 二、输入描述
    • 三、输出描述
    • 四、解题思路
    • 五、Java算法源码
    • 六、效果展示
      • 1、输入
      • 2、输出
      • 3、说明

华为OD机试 2023B卷题库疯狂收录中,刷题点这里

专栏导读

本专栏收录于《华为OD机试(JAVA)真题(A卷+B卷)》。

刷的越多,抽中的概率越大,每一题都有详细的答题思路、详细的代码注释、样例测试,发现新题目,随时更新,全天CSDN在线答疑。

一、题目描述

有一堆长方体积木,它们的高度和宽度都相同,但长度不一。

小橙想把这堆积木叠成一面墙,墙的每层可以放一个积木,或将两个积木拼接起来,要求每层的长度相同。若必须用完这些积木,叠成的墙最多为多少层?如下是叠成的一面墙的图示,积木仅按宽和高所在的面进行拼接。

在这里插入图片描述

二、输入描述

输入为一行,为各个积木的长度,数字为正整数,并由空格分隔。积木的数量和长度都不超过5000。

三、输出描述

输出一个数字,为墙的最大层数,如果无法按要求叠成每层长度一致的墙,则输出-1。

1、输入

3 6 6 3

2、输出

3

3、说明

题目要求:
每层可以放一个积木,或将两个积木拼接起来,要求每层的长度相同。

  • 可以组成3+3、6、6三层;
  • 可以组成3+6、3+6两层;

输出最大层数3

四、解题思路

  1. 输入一行数字,空格隔开;
  2. 降序排列好点,因为一张积木,可能就是一层,正序遍历较为方便;
  3. 获取最大层数;
  4. 特殊处理
    • 只有1块积木时,只能有1层;
    • 只有2块积木时,当两块积木的长度相同,会有1层,否则只有1层;
  5. 定义积木的最大值即每层的最小长度min、定义两个积木的最大值就是每层的最大长度max;
  6. 从每层的最小长度遍历到每层的最大长度,求这些积木可以拼接成的最大层数;
    • 定义双指针left、right;
    • list从大到小排序;
    • 一层只能有两个积木,最大值+最小值一定等于每层的长度,否则就无法拼接(每层的长度必须相等);
    • 再去掉一个积木一层的情况,两个积木一层时,最大值和最小值一定是配对存在的,到最后都配对完毕,才算成功;
    • 获取匹配成功的最大层数;
  7. 输出最大层数。

五、Java算法源码

java">public static void main(String[] args) {
    Scanner sc = new Scanner(System.in);
    // 降序排列好点,因为一张积木,可能就是一层,正序遍历较为方便
    List<Integer> list = Arrays.stream(sc.nextLine().split(" ")).mapToInt(Integer::parseInt).boxed().sorted((a, b) -> b - a).collect(Collectors.toList());
    // 获取最大层数
    int layerMax = getMaxLayer(list);
    System.out.println(layerMax);
}

/**
 * 获取最大层数
 *
 * @param list 每块积木的长度,降序排列
 * @return 最大层数
 */
private static int getMaxLayer(List<Integer> list) {
    int n = list.size();
    // 只有1块积木时,只能有1层
    if (n == 1) {
        return 1;
    }

    // 只有2块积木时,当两块积木的长度相同,会有1层,否则只有1层
    if (n == 2) {
        if (list.get(0).equals(list.get(1))) {
            return 2;
        } else {
            return 1;
        }
    }

    /**
     * 一层只能有2个积木或1个积木
     *
     * 积木的最大值即每层的最小长度
     * 两个积木的最大值就是每层的最大长度
     */
    Integer min = list.get(0);
    Integer max = list.get(0) + list.get(1);
    int layerMax = 0;

    /**
     * 从每层的最小长度遍历到每层的最大长度,求这些积木可以拼接成的最大层数
     */
    for (int length = min; length < max; length++) {
        // 层数
        int layer = 0;
        // 左指针
        int left = 0;
        // 右指针
        int right = n - 1;

        // list从大到小排序
        while (left < n && list.get(left).equals(length)) {
            left++;
            layer++;
        }

        while (left < right) {
            // 一层只能有两个积木,最大值+最小值一定等于每层的长度,否则就无法拼接(每层的长度必须相等)
            if ((list.get(left) + list.get(right) != length)) {
                break;
            }
            left++;
            right--;
            layer++;
        }

        /**
         * 这里有点绕
         * 再去掉一个积木一层的情况,两个积木一层时,最大值和最小值一定是配对存在的,到最后都配对完毕,才算成功
         * 获取匹配成功的最大层数
         */
        if (left == right + 1 && layer > layerMax) {
            layerMax = layer;
        }
    }
    return layerMax;
}

六、效果展示

1、输入

2 8 7 3 10 5 5

2、输出

4

3、说明

  • 2+8
  • 7+3
  • 10
  • 5+5

四层

在这里插入图片描述


🏆下一篇:华为OD机试 - 荒岛求生 - 栈Stack(Java 2023 B卷 100分)

🏆本文收录于,华为OD机试(JAVA)真题(A卷+B卷)

刷的越多,抽中的概率越大,每一题都有详细的答题思路、详细的代码注释、样例测试,发现新题目,随时更新,全天CSDN在线答疑。

在这里插入图片描述


http://www.niftyadmin.cn/n/5085412.html

相关文章

天眼查最新方式工商信息爬取(公开信息)

本章教程,主要介绍利用python效率提取天眼查公开工商信息。 官网地址:天眼查-商业查询平台_企业信息查询_公司查询_工商查询_企业信用信息系统 教程仅供参考,请勿滥用,由此带来的法律责任,需由自己承担。 1、数据预览 2、程序代码 #!/usr/bin/python # -*- coding: UTF-…

快排超详细,Leetcode排序数组题目带你升华掌握

大家好&#xff0c;这里是Dark FalmeMater。 这篇文章我将超级仔细地讲解快速排序&#xff0c;快排之所以叫快排&#xff0c;到底有多快&#xff0c;为什么这么快&#xff0c;还有快速排序的优化和改进&#xff0c;通过这篇文章你一定会对快排有进一步的掌握。 文章目录 Hoare版…

事务管理 AOP

一、Spring事务管理 1.Transactional//Spring 事务管理 2.事务进阶 1.事务属性-回滚&#xff08;rollbackFor&#xff09; 2.传播属性&#xff08;propagation&#xff09; 1.DeptLog日志对象 import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsC…

【Java每日一题】——第二十九题:超市购物程序设计(2023.10.13)

&#x1f383;个人专栏&#xff1a; &#x1f42c; 算法设计与分析&#xff1a;算法设计与分析_IT闫的博客-CSDN博客 &#x1f433;Java基础&#xff1a;Java基础_IT闫的博客-CSDN博客 &#x1f40b;c语言&#xff1a;c语言_IT闫的博客-CSDN博客 &#x1f41f;MySQL&#xff1a…

【专题】并查集判断冲突

&#xff08;1&#xff09;题目 P1955 [NOI2015] 程序自动分析 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) &#xff08;2&#xff09;解决思路 先排序&#xff0c;把所有e1的操作放在前面&#xff0c;然后再进行e0的操作。在进行e1的操作的时候&#xff0c;我们只要把它…

颠覆出海营销,机器学习带来买量新变化

这几年出海营销的神话都是机器学习给的&#xff1a; 机器学习显著降低CPI、机器学习大幅提高下载量、机器学习低成本撬动大流量... 此前&#xff0c;用户增长每一步都高度依赖营销人员的运营经验&#xff1b;现在&#xff0c;机器学习正在完全颠覆买量模式拓展营销格局&#…

AMEYA360:北京君正集成电路多核异构跨界处理器X2000

• 双XBurst2核&#xff0c;主频1.2GHz • 跨界第三核XBurst0(240MHz)&#xff0c;面向安全管理和实时控制 • H.264编、解码器1080P30fps • 内置LPDDR3 128MB • 双摄Mipi接口双ISP&#xff0c;可实时同步 • 丰富的外设接口 应用领域 • 智能音频&#xff1a;智能音箱&#…

免备案域名 DNS解析

1、注册购买域名地址&#xff08;免备案&#xff09; Name.com | Domain Names, Registration, Websites & Hosting 注意国家选中国区才可以使用支付宝&#xff0c;信息填写完之后创建账号&#xff0c;邮箱填写自己的邮箱 2、注册完登录账号进去找到Domain Name 搜索自动…