题目:

有很多随机大小的明信片,也有很多随机大小的信封。希望把一个明信片装到多个信封里。明信片只能装入比自己大的信封,信封也只能装入更大的信封。相同的大小无法装入。

为了保证最大数量的信封被使用和装入最多数量的卡片,请设计算法。

解决方法

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;@Overridepublic int compareTo(Card o) {// TODO Auto-generated method stubreturn size - o.size;}}static class Envelop implements Comparable<Envelop> {int id;int size;@Overridepublic int compareTo(Envelop o) {// TODO Auto-generated method stubreturn 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
]

总结:

结果并不是只有一种装法最多,但是设计的这个算法能保证装的最多卡片,和最多信封。

Android面试题目之五: 算法题--嵌套的信封相关推荐

  1. 应该是史上最全最新Java和Android面试题目(自己总结和收集的)

    Android面试题目 Java 基础 int占用几个字节 讲一下常见编码方式? UTF-8编码下中文占几个字节 int和Interger的区别 int.char.long各占多少字节数 string ...

  2. 一个BAT大厂面试者整理的Android面试题目!

    身边好多朋友都裸辞了,出去旅游了一圈之后,回来才发现,工作并没有想象中那么好找.朋友小A一心只想进大厂面试Android,于是面试了阿里巴巴.美团.滴滴等,最后在某个大厂经历了5轮面试后拿到了offe ...

  3. Python Json数据结构 打印json结构里含有$符号value的值 并且去重里面value相同的值 77hub 北京企业科技 企企 测试工程师面试 简单代码算法题

    目录 前言 一.题目要求 二.示例数据 三.示例代码 四.解题思路和方法分析 4.1 解题思路分析 4.2 正则方法解题 不正确的解题思路 4.3 递归方法解题 正确的解题思路 4.4 关于解题和面试 ...

  4. 软件测试基础知识面试题目(25题英文题目)

    软件测试基础知识面试题目(25题英文题目) 1. Verification is:  a. Checking that we are building the right system b. Chec ...

  5. 某通信公司的Android面试题目

    某通信公司的Android面试题目 今天的面试感觉做的不是很好,有些知识点明显没有掌握好,现在抽空把面试题目抄下来,同时努力掌握好对应的知识点. stack和heap有什么区别? heap是堆,sta ...

  6. Python 算法题之 俄罗斯套娃信封

    Python 算法题之 俄罗斯套娃信封 文章目录 Python 算法题之 俄罗斯套娃信封 给出题目

  7. Android面试题目(1-2-3--7)

    网上收集的Android 题目一 1.Activity生命周期说下,出现异常主要在那个阶段处理? 2.数据存储有哪几种方式?说过你用过哪些,做了哪些相关的项目?Sqlite用过说下? 3.Adapte ...

  8. android面试题目

    最近才开的博客,希望大家多多关注,andorid开发也做了3年有余了,也面试多家企业,借此机会分享一下,我们中遇到过的问题以及解决方案吧,希望能够对正在找工作的andoird程序员有一定的帮助.学完& ...

  9. 2022最新Android面试题目解答,Android MVP模式详解

    开头 Android开发,假如开始没有任何的开发经验的话, 千万不要着急,不要想着在短时间内就把一个语言学习好, 因为你之前没有任何的学习经验, 在这个过程中需要有耐心地学习完JAVA的基础知识, 然 ...

最新文章

  1. 腾讯某员工哀叹:门口卖早点的送孩子去私立了,一年学费顶我一年工资!
  2. 关于端口聚合或端口聚合称呼的误区
  3. java JMS消息队列
  4. NET问答: 如何从 event 中移除所有的 handler ?
  5. java impliments,dubbo使用GenericService泛化调用
  6. 细数Android开发者的艰辛历程,全网最新
  7. [LeetCode][Python][C#]刷题记录 26. 删除排序数组中的重复项
  8. 如何买卖股票?不要慌,我有妙招!
  9. leetcode mysql 排名_GitHub - nimphy/leetcode-Mysql
  10. 鱼c工作室小甲鱼的水平_历历万乡 | 得两代帝王喜爱,又上过国际舞台!深冬就去浙个“年鱼福气”加持的小村子吧!...
  11. MySQL索引. ref_mysql中索引利用情况(explain用法)
  12. BZOJ2768: [JLOI2010]冠军调查
  13. WinMTR 0.9.2 绿色免费版
  14. Go channel详解
  15. R语言length()和lengths()的区别
  16. 专访绿色和平:互联网科技公司,最好通过100%可再生能源实现直接减碳
  17. [Linux] WIN7下Virtualbox虚拟Ubuntu共享文件夹设置
  18. java输出字符串排列组合代码
  19. HDLBits学习笔记——状态机(中)
  20. 《深入理解大数据:大数据处理与编程实践》一一1.2 大数据处理技术简介

热门文章

  1. java 不写this_JAVAthis使用的那些事儿
  2. linux18.04安装显卡驱动,详细介绍ubuntu18.04安装NVIDIA显卡驱动(亲测有效!)
  3. python统计字符串数字个数_python统计字符串中数字个数_后端开发
  4. vue 数据更新不及时_陈词懒调的《未来天王》正式完结,再也不用担心她更新不及时了!...
  5. pcie 设备号多少位_怎么读取PCIe设备的VPD信息?
  6. 区块链教程Fabric1.0源代码分析Peer peer channel命令及子命令实现
  7. Nagios监控Windows server 2003 系统
  8. VMM虚拟机启动失败故障处理
  9. Ubuntu Nginx uwsgi django 初试
  10. 剑指offer系列之十:二进制中1的个数