当前位置: 首页 > news >正文

华为OD机试 - 最优结果的a数组数量 - 贪心思维(Java 2024 E卷 100分)

在这里插入图片描述

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

专栏导读

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

刷的越多,抽中的概率越大,私信哪吒,备注华为OD,加入华为OD刷题交流群,每一题都有详细的答题思路、详细的代码注释、3个测试用例、为什么这道题采用XX算法、XX算法的适用场景,发现新题目,随时更新,全天CSDN在线答疑。

一、题目描述

给定两个只包含数字的数组a、b,调整数组b里面数字的排列顺序,使得尽可能多的a[i] > b[i]。数组a和b中的数字各不相同。

输出所有可以达到最优结果的a数组组数量

二、输入描述

输入的第一行是数组a中的数字,其中只包含数字,每两个数字之间相隔一个空格,a数组大小不超过10。

输入的第一行是数组b中的数字,其中只包含数字,每两个数字之间相隔一个空格,b数组大小不超过10。

三、输出描述

输出所有可以达到最优结果的a数组数量

四、测试用例

输入输出仅供调试,后台判题数据一般不包含示例

测试用例1

1、输入

11 8 20
10 13 7

2、输出

1

3、说明

最优结果只有一个,a = [11, 20, 8],故输出1

测试用例2

1、输入

11 12 20
10 13 7

2、输出

2

3、说明

有两个a数组的排列可以达到最优结果,[12, 20, 11]和[11, 20, 12],故输出2

五、解题思路

我们需要对数组 b 进行排列,使得尽可能多的 a[i] > b[i]。可以对数组 a 进行排序,然后对 b 的所有排列进行逐个比较,判断哪些排列能满足 a[i] > b[i]。

暴力解法:对数组 b 求所有排列,并与排序后的 a 逐一比较,统计能够满足条件的情况。

详细步骤:

  1. 将数组 a 升序排序。
  2. 求出数组 b 的所有可能排列。
  3. 对于每一种排列,统计满足 a[i] > b[i] 的情况。
  4. 返回满足 a[i] > b[i] 条件的最优数量排列的个数。

六、Java算法源码

public class OdTest01 {// 计算数组b的所有排列并返回所有的排列结果public static List<List<Integer>> permute(List<Integer> nums) {List<List<Integer>> results = new ArrayList<>();permuteHelper(nums, 0, results);return results;}// 递归函数,求数组的全排列private static void permuteHelper(List<Integer> nums, int start, List<List<Integer>> results) {if (start == nums.size() - 1) {results.add(new ArrayList<>(nums));return;}for (int i = start; i < nums.size(); i++) {Collections.swap(nums, i, start);  // 交换permuteHelper(nums, start + 1, results);  // 递归调用Collections.swap(nums, i, start);  // 还原}}public static void main(String[] args) {Scanner sc = new Scanner(System.in);// 输入a数组List<Integer> a = new ArrayList<>();for (String num : sc.nextLine().split(" ")) {a.add(Integer.parseInt(num));}// 输入b数组List<Integer> b = new ArrayList<>();for (String num : sc.nextLine().split(" ")) {b.add(Integer.parseInt(num));}// 将a数组升序排序Collections.sort(a);// 求b数组的所有排列List<List<Integer>> permutations = permute(b);// 记录可以达到最优结果的个数int maxCount = 0;int optimalCount = 0;// 遍历每一个b的排列,和a数组进行比较for (List<Integer> perm : permutations) {int count = 0;// 统计a[i] > b[i]的数量for (int i = 0; i < a.size(); i++) {if (a.get(i) > perm.get(i)) {count++;}}// 更新最优结果if (count > maxCount) {maxCount = count;optimalCount = 1;  // 更新为新的最优情况} else if (count == maxCount) {optimalCount++;  // 多个排列可以达到相同的最优结果}}// 输出可以达到最优结果的排列个数System.out.println(optimalCount);}
}

七、效果展示

测试用例3

1、输入

1 2 3
4 5 6

2、输出

6

3、说明

a无论如何都会全输,故a任意排列都行,输出所有a数组的排列,6种排列。在这里插入图片描述


🏆下一篇:华为OD机试 - 简易内存池 - 逻辑分析(Java 2024 E卷 200分)

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

刷的越多,抽中的概率越大,私信哪吒,备注华为OD,加入华为OD刷题交流群,每一题都有详细的答题思路、详细的代码注释、3个测试用例、为什么这道题采用XX算法、XX算法的适用场景,发现新题目,随时更新,全天CSDN在线答疑。

在这里插入图片描述


http://www.mrgr.cn/news/20676.html

相关文章:

  • 【微机】DOSBox在windows上的安装和masm的配置
  • 计算机网络基础 - 应用层(2)
  • 认知杂谈48
  • 华为OD机试真题-猜字谜-2024年OD统一考试(E卷)
  • 每日一练5:最小花费爬楼梯(含链接)
  • 今日早报 每日精选15条新闻简报 每天一分钟 知晓天下事 9月6日,星期五
  • sync 命令
  • Docker 部署 Kibana (图文并茂超详细)
  • 读软件设计的要素02概念的目的
  • Flask如何传递URL参数
  • 使用sysctl
  • 创建一个桌面便签程序:Python和tkinter的应用
  • c++ 指针的用法详解
  • 彻底解决 node/npm, Electron下载失败相关问题, 从底层源码详解node electron 加速配置
  • 远程教育与学习:探索远程控制技术在教育领域的新机遇
  • SQL的高级查询练习知识点中(day25)
  • C++封装、继承和多态
  • 使用PowerShell检查Exchange服务状态:详细教程
  • 听故事学习 GAN
  • 智能家居系统(基于STM32F103C8T6标准库+FreeRTOS+Qt串口开发实现)