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 学习笔记 二维数组和对象数组
定义二维数组 int[][] a = new int[4][5]; 可以不指定列数 int[][] a = new int[4][]; 获取行 int i = a.length(); 如果使用第一个例 ...
- 前端性能优化(css动画篇)
正巧看到在送书,于是乎找了找自己博客上记录过的一些东西来及其无耻的蹭书了~~~ 小广告:更多内容可以看我的博客 最近拜读了一下html5rocks上几位大神写的一篇关于CSS3动画性能优化的文章,学到 ...
- CentOS7 分布式安装 Hadoop 2.8
1. 基本环境 1.1 操作系统 操作系统:CentOS7.3 1.2 三台虚拟机 172.20.20.100 master 172.20.20.101 slave1 172.20.20.102 sl ...
- 关于flutter插件地图的使用flutter_map
关于flutter插件地图的使用flutter_map flutter_map A Dart implementation of Leaflet for Flutter apps.一个基于leafle ...
- location.origin不兼容IE8解决方案
最近项目中遇到一个问题,在ajax跟后台交互时需要传一个全路径url.项目上线后,在谷歌,火狐,360等浏览器访问一切正常.但唯独IE8下出现问题,提示url:undefined ! 这就尴尬了!!! ...
- C#基础第五天
public struct Person { public string _name; public Gender _sex; public int _age; } public enum Gende ...
- hive笔记:复杂数据类型-map结构
map 结构 1. 语法:map(k1,v1,k2,v2,…) 操作类型:map ,map类型的数据可以通过'列名['key']的方式访问 案例: select deductions['Feder ...
- Java多线程基础(二)
1.多线程数据安全 线程同步:多个线程需要访问同一资源时,需要以某种顺序来确定该资源某一时刻只能被一个线程使用.从而,解决并发操作可能带来的异常. 2.同步代码块实现同步(部分代码的访问,我们希望它同 ...
- Svn在工作中的实践感悟
Svn是一款管理项目代码的版本控制系统,是基于集中式的版本控制系统.在工作中,由于实际开发工作的需要,部门是使用Svn来管理日常的项目开发任务.使用这么长时间了,来谈谈对Svn的感悟. 首先,说下工作 ...
- 电脑出现问题如何修复Windows 10
也许Windows 10无法启动.或者它可能会靴子,但会崩溃很多.在任何一种情况下,您都需要在使用PC之前解决问题.以下是修复Windows 10的几种方法. 方法1:使用Windows启动修复 如果 ...