當前位置:
首頁 > 知識 > Android面試題目之五:演算法題——嵌套的信封

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
]

總結:

結果並不是只有一種裝法最多,但是只要保證是裝的信封最多。

因此,此題目演算法不止一種。可能還有其他演算法,以後再具體分析。

喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 達人科技 的精彩文章:

sharding-method 介紹
Redis從單機到集群,一步步教你環境部署以及使用
Kafka 存儲機制和副本
WebApi Ajax 跨域請求解決方法
Oracle外鍵約束之在創建表時設置外鍵約束

TAG:達人科技 |

您可能感興趣

澳大利亞工作室宣布虛擬桌面題目表:The Crooked Crown
VulnHub中LazySysAdmin 題目詳解
新年開工,這份 Oracle DBA的面試題目,看看你合格不?
Essay精析:CBS今年的Essay題目,有點不一樣
2019年Common Application申請文書題目解讀及優秀文書寫作指南
Twitter上一道很火的題目,你能答對嗎?
4道與CVE結合web題目
強網杯web題目四道
emmm,不知道該起個啥題目
分享一些PHP面試題目
路由器漏洞復現分析第三彈:DVRF INTRO題目分析
開源聚合杯網路空間安全大賽官方部分題目writeup
Angelababy化身美拍千萬女神出題官 網友:題目滿滿少女心!
戚薇女兒lucky火了,「喜提」作文題目,網友:送分題?
2020 申請er 注意!CA公布最新Essay題目!誰在無所事事?
RCTF 2018 Magic題目詳解
TOPIK考試題目看不懂?題干高頻核心辭彙大整理
居然噴《青春豬頭少年》垃圾,知名youtober表示被題目騙到:「為什麼取這種讓人誤會的糞作書名?」
你們要的60屆TOPIK中高級答案來了!題目和解析全都有
IPhone XR降價後表現不錯,但蘋果還有四大難題目前無解