`
daojin
  • 浏览: 693182 次
  • 性别: Icon_minigender_1
  • 来自: 西安
社区版块
存档分类
最新评论

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

 
阅读更多

题目:

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

 

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

 

解决方法

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
]

 

总结:

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

 

 

 

 

0
0
分享到:
评论

相关推荐

    关于程序语言的一份试题

    #### 题目五:成绩分级 - **知识点**: - 成绩分级的规则设定:根据不同的分数段给出不同的等级。 - 使用条件语句(如if-else)实现成绩分级的逻辑处理。 - 分级规则的具体实现方法,包括如何处理边界值的情况。 ...

    面试高频算法题总结-剑指Offer题解

    面试高频算法题总结-剑指Offer题解,主要包含: 数据结构 数组 字符串 链表 栈和队列 二叉树 图 堆 线段树 ...算法 ...面试题3:数组中重复的数字 面试题4:二维数组的查找 面试题5:替换空格 ...面试题29:顺时针打印矩阵

    PTA-数据结构与算法题目集.zip

    PTA-数据结构与算法题目集 PTA-数据结构与算法题目集 PTA-数据结构与算法题目集 PTA-数据结构与算法题目集 PTA-数据结构与算法题目集 PTA-数据结构与算法题目集 PTA-数据结构与算法题目集 PTA-数据结构与算法题目集 ...

    算法大全-面试题-数据结构.pdf.zip_算法

    《算法大全-面试题-数据结构.pdf》是一个深入探讨算法和数据结构的资源,对于程序员,尤其是准备面试的开发者来说,这是一个极其宝贵的学习材料。它涵盖了算法和数据结构的基础概念,以及在实际问题中的应用,旨在...

    算法面试题100道for阿里、百度、腾讯、京东、美团、今日头条.pdf

    本书《算法面试题100道for阿里、百度、腾讯、京东、美团、今日头条.pdf》是一份面向希望进入中国顶尖互联网公司(如阿里、百度、腾讯、京东、美团、今日头条等)工作,尤其是软件开发岗位的求职者,所准备的面试材料...

    2008年11月全国计算机软考软件设计师考试下午试题和答案.txt

    **题目五:** - **题目描述**:关于用户角色及其功能权限的定义。 - **解答思路**:需要理解A1至A4代表的不同用户角色以及它们各自的职责范围,如User、Author、Reviewer和PCChair。 **题目六:** - **题目描述**:...

    cpp-剑指Offer算法面试题目总结CC实现

    《C++剑指Offer算法面试题目总结:CC++实现》 在编程面试中,C++与C语言常常是考察的重点,因为它们提供了底层控制和高效性能。本资料集以"剑指Offer"系列为基础,结合C++语言特性,对一系列经典的算法面试题目进行...

    基于Python的华为OD算法面试题-Huawei-OD-Python-master

    基于Python的华为OD算法面试题——Huawei-OD-Python-master。 本项目主要基于Python语言,使用很多Python语言的标准库,希望大家能通过题目,更好地熟悉Python语法,并灵活运用语法特性。 在推荐资料部分,给出了...

    acm新手训练方案新手必备

    - **最短路径算法**:包括Dijkstra算法、Bellman-Ford算法、Floyd算法等。 - **示例题目**: - POJ 1860: Dijkstra算法应用 - POJ 3259: Bellman-Ford算法实践 - POJ 1062: Floyd算法案例 - POJ 2253: 最短路径...

    android面试题目及其答案大全

    【Android面试知识点详解】 在Android面试中,面试官通常会关注候选人的基础知识、编程技能、设计模式理解以及项目经验。以下是一些常见的面试题目及答案的解析: 1. **++i 和 i++的区别**: - `++i`是前缀操作符...

    ACM算法题100题-经典算法库

    根据给定文件的信息,我们可以提炼出与ACM算法题及经典算法库相关的多个知识点。以下是对这些知识点的详细解析: ### ACM国际大学生软件大赛简介 ACM(Association for Computing Machinery)国际大学生软件大赛是...

    android面试题整理

    以上就是“android面试题整理”中可能涵盖的主要知识点,每个话题都值得深入探讨和实践,以确保在面试中能够全面展示自己的专业能力。通过持续学习和项目实践,开发者可以不断提高自己的技术水平,为面试做好充分...

    leetcode中国-algorithm-pattern-python:算法模式-python

    是大部分公司的出题源头,刷完面试中基本会遇到现题或者变形题,基本刷完这三部分,大部分国内公司的面试题应该就没什么问题了~ 1、 2、 3、 刷题时间可以合理分配,如果打算准备面试了,建议前面两部分 一个半月 ...

    leetcode中国-algorithm-pattern:算法模板-Golang

    刷完这些练习题,基本对数据结构和算法有自己的认识体会,基本大部分面试题都能写得出来,国内的 BAT、TMD 应该都不是问题 从 4 月份找工作开始,从 0 开始刷 LeetCode,中间大概花了一个半月(6 周)左右时间刷完 240...

    [最新答案V0.4版]微软等数据结构+算法面试100题[第41-60题答案]

    微软等公司数据结构+算法面试100题之第41-60题答案 --- 答案V0.4版 My Blog:http://blog.csdn.net/v_JULY_v 微软等100题系列,整理资源下载地址:题目系列: 1.[最新整理公布][汇总II]微软等数据结构+算法面试100...

    数据结构和算法面试题---微软、百度

    1. 数据结构与算法面试准备:文章提到的是微软和百度的面试题,这提示我们对于准备面试,特别是那些知名的科技公司,需要对数据结构和算法有深入的了解和准备。这包括但不限于对二元查找树、双向链表等基本数据结构...

    Introduction to Algorithms, 3rd edtion

    - **第五章**:概率分析与随机化算法 - **5.1** 聘用问题 - **5.2** 指示随机变量 - **5.3** 随机化算法 - **5.4** 概率分析与指示随机变量的进一步应用 ##### 第二部分:排序与序统计量 - **第六章**:堆排序...

    python-leetcode面试题解之第94题二叉树的中序遍历-题解.zip

    本压缩包文件"python-leetcode面试题解之第94题二叉树的中序遍历-题解.zip"聚焦于Python语言在解决LeetCode第94题——“二叉树的中序遍历”上的方法和思路,对于准备求职面试的程序员,尤其是Python开发者来说,这是...

Global site tag (gtag.js) - Google Analytics