java实现手办置换问题,有如下要求:手办的参观顺序为:{金刚狼、钢铁侠 ,美国队长,蝙蝠侠,钢铁俠、绿巨人、钢铁侠、雷神、蜘蛛俠、绿巨人、钢铁侠、绿巨人、蜘蛛俠、美国队长、蜘蛛俠、钢铁俠、美国队长、金刚狼、钢铁俠、美国队长} 【设计要求】 1.设置手办展示策略使得展览过程中手办置换次数最少。 2.请根据如下格式模拟输出整个手办参观过程。 现在朋友想参观“蝙蝠侠”手办。 当前展示盒中有〝金刚狼”,“钢铁俠’,“美国队长” 手办。(下面①和②根 据是否命中进行输出) ①该朋友发现〝蝙蝠俠”在展示盒中,小明将该手办的收藏经历讲给他听。 ②该朋友发现“蝙蝠俠’不在展示盒内,小明决定将手办“金刚狼”换出。
时间: 2023-07-10 07:40:21 浏览: 150
java问题
根据要求,可以使用贪心算法来解决手办置换问题。我们可以维护一个当前展示盒中的手办列表,每次参观一个新的手办时,从列表中查找该手办是否已经在展示盒中。如果已经在展示盒中,则不需要置换;如果不在展示盒中,则需要置换一个手办,优先置换最长时间不参观的手办。
以下是Java代码实现:
```java
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Scanner;
public class HandSwap {
private static final String[] HANDS = {"金刚狼", "钢铁侠", "美国队长", "蝙蝠侠", "钢铁侠", "绿巨人", "钢铁侠", "雷神",
"蜘蛛侠", "绿巨人", "钢铁侠", "绿巨人", "蜘蛛侠", "美国队长", "蜘蛛侠", "钢铁侠", "美国队长", "金刚狼",
"钢铁侠", "美国队长"};
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("手办参观顺序为:");
for (String hand : HANDS) {
System.out.print(hand + " ");
}
System.out.println();
List<String> display = new ArrayList<>();
int swapCount = 0;
System.out.println("现在朋友想参观“蝙蝠侠”手办。");
display.add(HANDS[0]);
display.add(HANDS[1]);
display.add(HANDS[2]);
show(display, "请注意,当前展示盒中有");
for (int i = 3; i < HANDS.length; i++) {
String hand = HANDS[i];
if (display.contains(hand)) {
show(display, "该朋友发现" + hand + "在展示盒中,小明将该手办的收藏经历讲给他听。");
} else {
int swapIndex = findSwapIndex(display, HANDS, i);
String swapHand = display.get(swapIndex);
display.set(swapIndex, hand);
swapCount++;
show(display, "该朋友发现" + hand + "不在展示盒内,小明决定将手办" + swapHand + "换出。");
}
}
System.out.println("展示结束,共进行了" + swapCount + "次手办置换。");
}
private static int findSwapIndex(List<String> display, String[] hands, int index) {
Map<String, Integer> lastSeen = new HashMap<>();
for (int i = 0; i < display.size(); i++) {
lastSeen.put(display.get(i), i);
}
int swapIndex = 0;
int maxLastSeen = -1;
for (int i = 0; i < display.size(); i++) {
String hand = display.get(i);
int lastSeenIndex = lastSeen.containsKey(hand) ? lastSeen.get(hand) : -1;
if (lastSeenIndex == -1) {
return i;
} else if (lastSeenIndex > maxLastSeen) {
maxLastSeen = lastSeenIndex;
swapIndex = i;
}
}
return swapIndex;
}
private static void show(List<String> display, String message) {
System.out.print(message);
for (String hand : display) {
System.out.print("“" + hand + "”");
}
System.out.println("手办。");
}
}
```
这个实现中,我们维护了一个当前展示盒中的手办列表`display`,并使用`findSwapIndex()`方法来查找需要置换的手办。在每次参观一个新的手办时,我们根据该手办是否在展示盒中来判断是输出“该朋友发现...在展示盒中”还是“该朋友发现...不在展示盒内”的提示信息,并根据需要进行置换操作。最后输出总的置换次数。
阅读全文