题目:
有很多随机大小的明信片,也有很多随机大小的信封。希望把一个明信片装到多个信封里。明信片只能装入比自己大的信封,信封也只能装入更大的信封。相同的大小无法装入。
为了保证最大数量的信封被使用和装入最多数量的卡片,请设计算法。
解决方法
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 ]
总结:
结果并不是只有一种装法最多,但是设计的这个算法能保证装的最多卡片,和最多信封。
相关推荐
JAVA经典算法面试39题及答案 本资源总结了39道经典的 JAVA 算法面试题目,每个题目都附带答案,涵盖了常见的算法问题,旨在帮助读者更好地掌握 JAVA 编程语言和算法设计。 算法概述 算法是计算机科学中最重要的...
《算法大全-面试题-数据结构.pdf》是一个深入探讨算法和数据结构的资源,对于程序员,尤其是准备面试的开发者来说,这是一个极其宝贵的学习材料。它涵盖了算法和数据结构的基础概念,以及在实际问题中的应用,旨在...
本书《算法面试题100道for阿里、百度、腾讯、京东、美团、今日头条.pdf》是一份面向希望进入中国顶尖互联网公司(如阿里、百度、腾讯、京东、美团、今日头条等)工作,尤其是软件开发岗位的求职者,所准备的面试材料...
Educoder题目:数据结构与算法 - 线性表答案解析.md
**题目五:** - **题目描述**:关于用户角色及其功能权限的定义。 - **解答思路**:需要理解A1至A4代表的不同用户角色以及它们各自的职责范围,如User、Author、Reviewer和PCChair。 **题目六:** - **题目描述**:...
《C++剑指Offer算法面试题目总结:CC++实现》 在编程面试中,C++与C语言常常是考察的重点,因为它们提供了底层控制和高效性能。本资料集以"剑指Offer"系列为基础,结合C++语言特性,对一系列经典的算法面试题目进行...
### 华为OD面试算法真题解析:抢7游戏 ...以上是对华为OD面试算法真题“抢7游戏”的详细解析及实现过程,通过此题不仅能够加深对应聘者对动态规划这一算法思想的理解,还能提高解决实际问题的能力。
【Android面试知识点详解】 在Android面试中,面试官通常会关注候选人的基础知识、编程技能、设计模式理解以及项目经验。以下是一些常见的面试题目及答案的解析: 1. **++i 和 i++的区别**: - `++i`是前缀操作符...
以上就是“android面试题整理”中可能涵盖的主要知识点,每个话题都值得深入探讨和实践,以确保在面试中能够全面展示自己的专业能力。通过持续学习和项目实践,开发者可以不断提高自己的技术水平,为面试做好充分...
本项目专注于在Android平台上实现多种填充算法,以测试其效率和性能。以下将详细阐述这些填充算法及其在Android环境中的应用。 1. **逐点判别填充**(Bresenham's Line Algorithm): 这是一种用于绘制像素点到点...
是大部分公司的出题源头,刷完面试中基本会遇到现题或者变形题,基本刷完这三部分,大部分国内公司的面试题应该就没什么问题了~ 1、 2、 3、 刷题时间可以合理分配,如果打算准备面试了,建议前面两部分 一个半月 ...
PTA-数据结构与算法题目集 PTA-数据结构与算法题目集 PTA-数据结构与算法题目集 PTA-数据结构与算法题目集 PTA-数据结构与算法题目集 PTA-数据结构与算法题目集 PTA-数据结构与算法题目集 PTA-数据结构与算法题目集 ...
刷完这些练习题,基本对数据结构和算法有自己的认识体会,基本大部分面试题都能写得出来,国内的 BAT、TMD 应该都不是问题 从 4 月份找工作开始,从 0 开始刷 LeetCode,中间大概花了一个半月(6 周)左右时间刷完 240...
玩转算法面试-- Leetcode真题分门别类 资源列表: 00-The-Opening 01-What-is-Algorithm-Interview 02-Time-Complexity 03-Using-Array 04-Using-Hash-Table 05-About-Linked-List 06-Stack-and-Queue 07-Binary-...
- 对于所有 `1 ≤ m, n ≤ 10` 的输入,欧几里得算法最少需要执行一次除法操作,而最多需要执行五次除法操作。 #### 3. 农夫过河问题与过桥问题 **知识点描述:** 这两道题目分别涉及到逻辑推理与优化策略。 **...
1. 数据结构与算法面试准备:文章提到的是微软和百度的面试题,这提示我们对于准备面试,特别是那些知名的科技公司,需要对数据结构和算法有深入的了解和准备。这包括但不限于对二元查找树、双向链表等基本数据结构...
【算法面试题】 一、构建最小多位数 这个问题的核心是找到一种有效的方法,将一组正整数连接起来形成一个最小的多位数。解决方案是采用基数排序的思路。 1. **算法描述**: - 初始化一个数字集合S。 - 选取最小...
《牛客题霸-算法篇-程序员面试高频题(C++)》是针对准备程序员面试的C++学习者设计的一套资源集。这个压缩包文件包含了一个名为`newcoder-oj-main`的主目录,很可能包含了源代码、题目描述、测试数据以及解题思路等...
- 随着信息技术的发展,大数据已成为推动企业数字化转型的关键因素之一。通过构建大数据平台,可以更好地利用数据资产,提升决策效率和服务水平。 **1.2 建设目标** - **总体目标:** - 构建一个集数据采集、...