题目:
有很多随机大小的明信片,也有很多随机大小的信封。希望把一个明信片装到多个信封里。明信片只能装入比自己大的信封,信封也只能装入更大的信封。相同的大小无法装入。
为了保证最大数量的信封被使用和装入最多数量的卡片,请设计算法。
解决方法
1.将明信片和信封各自排序。
2.找到第一个明信片。
3.找到没使用的第一个信封。
4. 是否可装入,是则装入。否按顺序向前从大到小找卡片,能装入则装入。不能装入则继续从大到小找卡片。直到没有卡片可找。
代码
package sort; import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; public class NestedEnvelope { public static void main(String[] args) { List<Card> cards = new ArrayList<>(); for (int i = 0; i < 5; ++i) { Card card = new Card(); card.size = i * 2; card.id = i; cards.add(card); } List<Envelop> evelops = new ArrayList<>(); for (int i = 0; i < 10; ++i) { Envelop env = new Envelop(); env.size = i; env.id = i; evelops.add(env); } HashMap<Card, List<Envelop>> results = putInCard(cards, evelops); for (Map.Entry<Card, List<Envelop>> entry : results.entrySet()) { System.out.println("["); System.out.println("card:" + entry.getKey().size); for (Envelop env : entry.getValue()) { System.out.println("envelop:" + env.size); } System.out.println("]"); } } static class Card implements Comparable<Card> { int id; int size; @Override public int compareTo(Card o) { // TODO Auto-generated method stub return size - o.size; } } static class Envelop implements Comparable<Envelop> { int id; int size; @Override public int compareTo(Envelop o) { // TODO Auto-generated method stub return size - o.size; } } public static HashMap<Card, List<Envelop>> putInCard(List<Card> cards, List<Envelop> envelops) { Collections.sort(cards); Collections.sort(envelops); HashMap<Card, List<Envelop>> cardWithEnvelops = new HashMap<Card, List<Envelop>>(); for (int i = 0; i < cards.size(); ++i) { Card card = cards.get(i); Card nextCard = null; if (i + 1 < cards.size()) { nextCard = cards.get(i + 1); } List<Envelop> cardEnvelops = new ArrayList<Envelop>(); cardWithEnvelops.put(card, cardEnvelops); Envelop lastEnvelop = null; while (envelops.size() > 0) { Envelop envelop = envelops.get(0); if ((lastEnvelop != null && envelop.size == lastEnvelop.size) || envelop.size == card.size) { for (int indexCard = i - 1; indexCard >= 0; --indexCard) { List<Envelop> preEnvelops = cardWithEnvelops.get(cards.get(indexCard)); if (preEnvelops.size() == 0) { preEnvelops.add(envelop); } else { Envelop maxEnv = preEnvelops.get(preEnvelops.size() - 1); if (maxEnv.size < envelop.size) { preEnvelops.add(envelop); } } } envelops.remove(envelop); continue; } if (envelop.size > card.size && (nextCard == null || envelop.size <= nextCard.size)) { cardEnvelops.add(envelop); lastEnvelop = envelop; envelops.remove(envelop); } else { break; } } } return cardWithEnvelops; } }
打印:
[ card:4 envelop:5 envelop:6 ] [ card:8 envelop:9 ] [ card:0 envelop:1 envelop:2 ] [ card:2 envelop:3 envelop:4 ] [ card:6 envelop:7 envelop:8 ]
总结:
结果并不是只有一种装法最多,但是设计的这个算法能保证装的最多卡片,和最多信封。
相关推荐
#### 题目五:成绩分级 - **知识点**: - 成绩分级的规则设定:根据不同的分数段给出不同的等级。 - 使用条件语句(如if-else)实现成绩分级的逻辑处理。 - 分级规则的具体实现方法,包括如何处理边界值的情况。 ...
面试高频算法题总结-剑指Offer题解,主要包含: 数据结构 数组 字符串 链表 栈和队列 二叉树 图 堆 线段树 ...算法 ...面试题3:数组中重复的数字 面试题4:二维数组的查找 面试题5:替换空格 ...面试题29:顺时针打印矩阵
PTA-数据结构与算法题目集 PTA-数据结构与算法题目集 PTA-数据结构与算法题目集 PTA-数据结构与算法题目集 PTA-数据结构与算法题目集 PTA-数据结构与算法题目集 PTA-数据结构与算法题目集 PTA-数据结构与算法题目集 ...
《算法大全-面试题-数据结构.pdf》是一个深入探讨算法和数据结构的资源,对于程序员,尤其是准备面试的开发者来说,这是一个极其宝贵的学习材料。它涵盖了算法和数据结构的基础概念,以及在实际问题中的应用,旨在...
本书《算法面试题100道for阿里、百度、腾讯、京东、美团、今日头条.pdf》是一份面向希望进入中国顶尖互联网公司(如阿里、百度、腾讯、京东、美团、今日头条等)工作,尤其是软件开发岗位的求职者,所准备的面试材料...
Educoder题目:数据结构与算法 - 栈答案解析.md
**题目五:** - **题目描述**:关于用户角色及其功能权限的定义。 - **解答思路**:需要理解A1至A4代表的不同用户角色以及它们各自的职责范围,如User、Author、Reviewer和PCChair。 **题目六:** - **题目描述**:...
《C++剑指Offer算法面试题目总结:CC++实现》 在编程面试中,C++与C语言常常是考察的重点,因为它们提供了底层控制和高效性能。本资料集以"剑指Offer"系列为基础,结合C++语言特性,对一系列经典的算法面试题目进行...
基于Python的华为OD算法面试题——Huawei-OD-Python-master。 本项目主要基于Python语言,使用很多Python语言的标准库,希望大家能通过题目,更好地熟悉Python语法,并灵活运用语法特性。 在推荐资料部分,给出了...
- **最短路径算法**:包括Dijkstra算法、Bellman-Ford算法、Floyd算法等。 - **示例题目**: - POJ 1860: Dijkstra算法应用 - POJ 3259: Bellman-Ford算法实践 - POJ 1062: Floyd算法案例 - POJ 2253: 最短路径...
【Android面试知识点详解】 在Android面试中,面试官通常会关注候选人的基础知识、编程技能、设计模式理解以及项目经验。以下是一些常见的面试题目及答案的解析: 1. **++i 和 i++的区别**: - `++i`是前缀操作符...
根据给定文件的信息,我们可以提炼出与ACM算法题及经典算法库相关的多个知识点。以下是对这些知识点的详细解析: ### ACM国际大学生软件大赛简介 ACM(Association for Computing Machinery)国际大学生软件大赛是...
以上就是“android面试题整理”中可能涵盖的主要知识点,每个话题都值得深入探讨和实践,以确保在面试中能够全面展示自己的专业能力。通过持续学习和项目实践,开发者可以不断提高自己的技术水平,为面试做好充分...
是大部分公司的出题源头,刷完面试中基本会遇到现题或者变形题,基本刷完这三部分,大部分国内公司的面试题应该就没什么问题了~ 1、 2、 3、 刷题时间可以合理分配,如果打算准备面试了,建议前面两部分 一个半月 ...
刷完这些练习题,基本对数据结构和算法有自己的认识体会,基本大部分面试题都能写得出来,国内的 BAT、TMD 应该都不是问题 从 4 月份找工作开始,从 0 开始刷 LeetCode,中间大概花了一个半月(6 周)左右时间刷完 240...
微软等公司数据结构+算法面试100题之第41-60题答案 --- 答案V0.4版 My Blog:http://blog.csdn.net/v_JULY_v 微软等100题系列,整理资源下载地址:题目系列: 1.[最新整理公布][汇总II]微软等数据结构+算法面试100...
1. 数据结构与算法面试准备:文章提到的是微软和百度的面试题,这提示我们对于准备面试,特别是那些知名的科技公司,需要对数据结构和算法有深入的了解和准备。这包括但不限于对二元查找树、双向链表等基本数据结构...
- **第五章**:概率分析与随机化算法 - **5.1** 聘用问题 - **5.2** 指示随机变量 - **5.3** 随机化算法 - **5.4** 概率分析与指示随机变量的进一步应用 ##### 第二部分:排序与序统计量 - **第六章**:堆排序...