AirBnB春招笔试题
试题说明
笔试题只有一道,限时1小时。
模拟一个战争外交游戏,游戏中定义了三种操作:
A city1 Hold : 军队A 占领了city1
A city1 Move city2 : 军队A从city1移动到city2
A city1 Support B : 占领了city1的军队A增援军队B,得到增援的军队B的strength+1;
注意:
1. 每支军队的初始strength为1;
2. 如果有多个军队到达了同一个城市,则strength高的军队存活并占领该城市,strength低军队死亡;
3. 如果某支军队正在交战(即其所在的城市除自己外还有其他军队),则该军队的任何增援行动无效;
输入:
一系列字符串表示的的Action,如:
A Munich Hold
B Bohemia Move Munich
C Warsaw Support B
输出:
按字母表顺序排列的各个军队的状态(死亡或者存活,如果存活输出驻扎地点),上面用例的输出为:
A [dead]
B Munich
C Warsaw
下面是原题:






JAVA题解:
//游戏的规则是把所有的动作执行之后再判断状态,每个回合之中的所有动作没有先后之分。
import java.util.*; public class testAirBnB {
static List<String> evaluateActions(List<String> actions) {
Map<String, army> armies = new TreeMap();
Map<String, city> cities = new HashMap<>();
ArrayList<String[]> manu = new ArrayList<>();
ArrayList<String[]> supportList = new ArrayList<>(); for (String action : actions) {
//将每个aciton拆解
String[] s = action.split(" ");
//注册每个军队
army a = new army(s[0]);
armies.put(s[0], a);
manu.add(s);
} for (String[] str : manu) {
//遍历每个action, 执行每个action
//获取当前action的执行主体军队
army a = armies.get(str[0]);
//记录该军队当前所在城市
a.whereNow = str[1];
//保存目前军队所在城市
city tmpCity; //为a当前所在的城市注册,如果记录中不存在该城市,新建一个记录,并将a军队加入其hold军队表
if (!cities.containsKey(a.whereNow)) {//该城市之前未被注册过
tmpCity = new city(a.whereNow, a.strength, a.name);
cities.put(a.whereNow, tmpCity);
} else {
//该城市之前注册过,但因为之前的战斗所有军队都死亡,现在可以重新hold;这里假设
//所有的操作都是有效的,即不存在向已有军队驻扎的城市hold的action发生
tmpCity = cities.get(a.whereNow);
tmpCity.holdArmies.put(a.name, a.strength);
} if (str[2].equals("Hold")) {
//keep default;
} else if (str[2].equals("Move")) {
//从当前的城市撤退
tmpCity.holdArmies.remove(a.name);
//进军到目的城市
a.whereNow = str[3];
//如果要去的城市已经被注册,直接加入驻扎名单
if (cities.containsKey(a.whereNow)) {
tmpCity = cities.get(a.whereNow);
tmpCity.holdArmies.put(a.name, a.strength);
}
//否则说明要去的城市未被驻扎过,直接注册该城市并记录驻扎信息
else {
tmpCity = new city(a.whereNow, a.strength, a.name);
cities.put(a.whereNow, tmpCity);
} } else if (str[2].equals("Support")) {
//必须等到所有的军队移动完毕才能确定是否可以增援
supportList.add(str);
// //为友军加buf
// army friend = armies.get(str[3]);
// friend.strength++;
// //更新友军所在城市注册表中友军的strength
// city friendCity = cities.get(friend.whereNow);
// friendCity.holdArmies.put(friend.name, friend.strength);
}
} //处理增援
//如果A没有underAttack, 则可以增援
//否则不可以增援
for(String[] sptAction: supportList){
//如果A所在城市的驻扎军队大于1只,说明A正在underAttack, A的增援行动无效 if(cities.get(armies.get(sptAction[0]).whereNow).holdArmies.size()>1)
continue;
//否则增援有效
else{
//为友军加buf
army friend = armies.get(sptAction[3]);
friend.strength++;
//更新友军所在城市注册表中友军的strength
city friendCity = cities.get(friend.whereNow);
friendCity.holdArmies.put(friend.name, friend.strength);
}
} //跟据城市来判断每只军队的生存状况
for (city tmpCity : cities.values()) {
//当前城市的驻扎军队少于两支,不会发生战争
if (tmpCity.holdArmies.size() < 2)
continue;
//驻扎军队大于两支 else {
List<Map.Entry<String, Integer>> list = new ArrayList<>(tmpCity.holdArmies.entrySet());
// 按treeMap的值从大到小排序
Collections.sort(list, new Comparator<Map.Entry<String, Integer>>() {
@Override
public int compare(Map.Entry<String, Integer> o1, Map.Entry<String, Integer> o2) {
return -o1.getValue().compareTo(o2.getValue());
}
});
//如果该城市的驻扎军队表中战力靠前的两支军队的战力相等,则驻扎在该城市的所有军队都回死亡(包括战力更低的)
if (list.get(0).getValue().equals(list.get(1).getValue())) {
//该城市所有军队都死亡
for (int i = 0; i < list.size(); i++) {
armies.get(list.get(i).getKey()).isAlive = false;
}
} else {
//否则除了第一支军队(战力最高的军队),其余军队死亡
for (int i = 1; i < list.size(); i++) {
armies.get(list.get(i).getKey()).isAlive = false; }
}
}
} // 循环检查每个城市的状态,如果isAlive为false, 输出城市名+[dead]
// 否则输出城市名+whereNow
List<String> result = new ArrayList<>();
for (army unit : armies.values()) {
//如果状态标记为dead,直接输出
if (!unit.isAlive)
result.add(unit.name + " " + "[dead]");
else {
result.add(unit.name + " " + unit.whereNow);
}
} for (String s : result)
System.out.println(s); return result;
} public static void main(String[] args) { List<String> input = new ArrayList<>();
//测试数据1
// input.add("A Munich Hold");input.add("B Warsaw Move Bohemia");
//测试数据2
input.add("A Munich Hold");input.add("B Bohemia Move Munich");input.add("C Warsaw Support B");
//测试数据3
// input.add("A Munich Hold");input.add("B Bohemia Move Munich");input.add("C Prussia Move Munich");input.add("D Warsaw Hold");
//测试数据4
// input.add("A Munich Support B");input.add("B Bohemia Move Prussia");input.add("C Prussia Hold");input.add("D Warsaw Move Munich");
//测试数据5
// input.add("A Munich Support B");input.add("B Oakland Move Munich");
evaluateActions(input);
} static class army {
String name;
String whereNow;
int strength = 1;
// boolean underAttack = false;
boolean isAlive = true; army(String _name) {
name = _name;
}
} static class city {
String name;
TreeMap<String, Integer> holdArmies = new TreeMap<>(); city(String city_name, int strength, String army_name) {
name = city_name;
holdArmies.put(army_name, strength);
}
} }
AirBnB春招笔试题的更多相关文章
- [算法]美团春招笔试题C-求有趣子序列数(DP)
题目 输入n,以及长度为n的数组元素 输出数组的非空子序列中有多少个"有趣序列"mod 998244353,有趣序列指所有元素满足arr[i]%i == 0, i从0记. 例: 输 ...
- TX2017秋招笔试题之编码
问题描述: 假定一种编码的编码范围是a ~ y的25个字母,从1位到4位的编码,如果我们把该编码按字典序排序,形成一个数组如下: a, aa, aaa, aaaa, aaab, aaac, - -, ...
- 2018春招-今日头条笔试题-第四题(python)
题目描述:2018春招-今日头条笔试题5题(后附大佬答案-c++版) #-*- coding:utf-8 -*- class Magic: ''' a:用于存储数组a b:用于存储数组b num:用于 ...
- 2018春招-今日头条笔试题-第三题(python)
题目描述:2018春招-今日头条笔试题5题(后附大佬答案-c++版) 解题思路: 本题的做法最重要的应该是如何拼出‘1234567890’,对于输入表达试获得对应的结果利用python内置函数eval ...
- 2018春招-今日头条笔试题-第二题(python)
题目描述:2018春招-今日头条笔试题5题(后附大佬答案-c++版) 解题思路: 利用深度优先搜索 #-*- coding:utf-8 -*- class DFS: ''' num:用于存储最后执行次 ...
- 2018春招-今日头条笔试题-第一题(python)
题目描述:2018春招-今日头条笔试题5题(后附大佬答案-c++版) 解题思路: 要想得到输入的数字列中存在相隔为k的数,可以将输入的数字加上k,然后判断其在不在输入的数字列中即可. #-*- cod ...
- ACM_招新笔试题系列——买包子
招新笔试题系列——买包子 Time Limit: 2000/1000ms (Java/Others) Problem Description: 小华刚到大学,一天早上她替她室友买早餐,一共要N个包子. ...
- 2018春招实习笔试面试总结(PHP)
博主双非渣本计算机软件大三狗一枚,眼看着春招就要结束了,现将自己所经历的的整个春招做一个个人总结. 首先就是关于投递计划,博主自己整理了一份各大公司的春招信息,包括网申地址,开始时间,结束时间,以及自 ...
- Java工程师笔试题整理[校招篇]
Java工程师笔试题整理[校招篇] 隔着两个月即将开始校招了.你是不是也想借着这个机会崭露头角,拿到某些大厂的offer,赢取白富美.走上人生巅峰?当然如果你还没能打下Java基础,一定要先打 ...
随机推荐
- Java 学习笔记 观察者模式与适配者模式 监控文件夹
2019.4.12 适配器模式,如果某个类需要实现多个方法,但是开发过程中只需要实现其中的一两个方法,直接使用该类的适配器类,复写需要实现的方法即可 观察者模式:有多个观察者observe观察一个主体 ...
- Java基础:Object类中的equals与hashCode方法
前言 这个系列的文章主要用来记录我在学习和复习Java基础知识的过程中遇到的一些有趣好玩的知识点,希望大家也喜欢. 一切皆对象 对于软件工程来说面向对象编程有一套完整的解决方案:OOA.OOD.O ...
- Ext.override
Ext.override:4种情况 如果target是使用Ext.define声明的一个类,给出overrides那个类的override方法被调用(看Ext.Base.override) If th ...
- 20, CSS 定义选择器
1. ID 与类 2. 层叠 3. 分组 4. 继承 5. 上下文选择器 6. 子类选择器 7. 其他选择器 8. 结构与注释 20.1 ID 与类 选择器是用于控制页面设计的样式.即 ID 选择器何 ...
- alfs学习笔记-自动化构建lfs系统
我的邮箱地址:zytrenren@163.com欢迎大家交流学习纠错! 一名linux爱好者,记录构建Linux From Scratch的过程 经博客园-骏马金龙前辈介绍,开始接触学习lfs,用博客 ...
- Arcgis瓦片--js客户端加载
接上篇博客,下载好arcgis格式的瓦片数据以后,需要用js客户端在前端加载出来.这里介绍两种方案: 1.使用超图iServer将瓦片发布成rest地图服务,或者arcgis地图服务,客户端直接加载 ...
- JMeter 内置日期(时间)函数总结
JMeter 内置日期(时间)函数总结 by:授客 QQ:1033553122 1. 测试环境 apache-jmeter-3.3 下载地址: http://jmeter.apache.org/c ...
- C#基础第六天
数组 方法 实现代码的重用 参数 返回值 注释 return 语法:[public] static 返回值类型 方法名([参数列表]){ 方法体;}public:访问修饰符,公开的,公共的s ...
- Python生成器、推导式之前襟后裾
生成器 函数体内有yield选项的就是生成器,生成器的本质是迭代器,由于函数结构和生成器结构类似,可以通过调用来判断是函数还是生成器,如下: def fun(): yield "我是生成器& ...
- Python Learning: 01
After a short period of new year days, I found life a little boring. So just do something funny--Py ...