试题说明

笔试题只有一道,限时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春招笔试题的更多相关文章

  1. [算法]美团春招笔试题C-求有趣子序列数(DP)

    题目 输入n,以及长度为n的数组元素 输出数组的非空子序列中有多少个"有趣序列"mod 998244353,有趣序列指所有元素满足arr[i]%i == 0, i从0记. 例: 输 ...

  2. TX2017秋招笔试题之编码

    问题描述: 假定一种编码的编码范围是a ~ y的25个字母,从1位到4位的编码,如果我们把该编码按字典序排序,形成一个数组如下: a, aa, aaa, aaaa, aaab, aaac, - -, ...

  3. 2018春招-今日头条笔试题-第四题(python)

    题目描述:2018春招-今日头条笔试题5题(后附大佬答案-c++版) #-*- coding:utf-8 -*- class Magic: ''' a:用于存储数组a b:用于存储数组b num:用于 ...

  4. 2018春招-今日头条笔试题-第三题(python)

    题目描述:2018春招-今日头条笔试题5题(后附大佬答案-c++版) 解题思路: 本题的做法最重要的应该是如何拼出‘1234567890’,对于输入表达试获得对应的结果利用python内置函数eval ...

  5. 2018春招-今日头条笔试题-第二题(python)

    题目描述:2018春招-今日头条笔试题5题(后附大佬答案-c++版) 解题思路: 利用深度优先搜索 #-*- coding:utf-8 -*- class DFS: ''' num:用于存储最后执行次 ...

  6. 2018春招-今日头条笔试题-第一题(python)

    题目描述:2018春招-今日头条笔试题5题(后附大佬答案-c++版) 解题思路: 要想得到输入的数字列中存在相隔为k的数,可以将输入的数字加上k,然后判断其在不在输入的数字列中即可. #-*- cod ...

  7. ACM_招新笔试题系列——买包子

    招新笔试题系列——买包子 Time Limit: 2000/1000ms (Java/Others) Problem Description: 小华刚到大学,一天早上她替她室友买早餐,一共要N个包子. ...

  8. 2018春招实习笔试面试总结(PHP)

    博主双非渣本计算机软件大三狗一枚,眼看着春招就要结束了,现将自己所经历的的整个春招做一个个人总结. 首先就是关于投递计划,博主自己整理了一份各大公司的春招信息,包括网申地址,开始时间,结束时间,以及自 ...

  9. Java工程师笔试题整理[校招篇]

    Java工程师笔试题整理[校招篇]     隔着两个月即将开始校招了.你是不是也想借着这个机会崭露头角,拿到某些大厂的offer,赢取白富美.走上人生巅峰?当然如果你还没能打下Java基础,一定要先打 ...

随机推荐

  1. Java_设计模式之享元模式

    1.关于享元模式 享元模式有点类似于单例模式,都是只生成一个对象被共享使用.享元模式主要目的就是让多个对象实现共享,减少不会要额内存消耗,将多个对同一对象的访问集中起来,不必为每个访问者创建一个单独的 ...

  2. Fundebug前端JavaScript插件更新至1.7.1,拆分录屏代码,还原部分Script error.

    摘要: BUG监控插件压缩至18K. 1.7.1拆分了录屏代码,BUG监控插件压缩至18K,另外我们还原了部分Script error,帮助用户更方便地Debug.请大家及时更新哈~ 拆分录屏代码 从 ...

  3. 微信小程序域名配置问题

    最主要的:不能用ip地址,不能用localhost,域名要经过备案等 这些在 https://developers.weixin.qq.com/miniprogram/dev/framework/ab ...

  4. 一句话总结kNN算法

    一句话总结kNN算法 核心:模板匹配,将样本分到离它最相似的样本所属的类. kNN算法本质上使用了模板匹配的思想.要确定一个样本的类别,可以计算它与所有训练样本的距离,然后找出和该样本最接近的k个样本 ...

  5. Android Studio调试手机或者安装APK的时候出现install failed test only

    1.检查\app\src\main\AndroidMainfest.xml中是否有testOnly属性为true,如果有去掉或者改为false 2.检查Android Studio和gradle版本是 ...

  6. 测试系统工程师TSE需要具备的四项能力

    文/杨学明 如今,国内所有的研发型的公司都有测试部门,无论测试团队大小,都有测试组长,测试经理,测试工程师等头衔,但随着产品和业务的质量要求越来越高,产品的市场竞争越来越激烈,公司领导对产品测试的要求 ...

  7. dede 采集到数据后,发布日期变为本地日期解决方法

    找到dede目录下的co_export.php 大概在170行左右 //获取时间和标题 $pubdate = $sortrank = time(); $title = $row->title; ...

  8. Python第十一天 异常处理 glob模块和shlex模块 打开外部程序和subprocess模块 subprocess类 Pipe管道 operator模块 sorted函数 os模块 hashlib模块 platform模块 csv模块

    Python第十一天    异常处理  glob模块和shlex模块    打开外部程序和subprocess模块  subprocess类  Pipe管道  operator模块   sorted函 ...

  9. bug优先级别

    https://www.cnblogs.com/evablogs/p/6785083.html bug缺陷的优先级别 首先需要对一个版本进行冒烟测试,确定基本功能测试,如果不通过的话进行后期的测试已经 ...

  10. 列表、enumerate()函数,以及查看数据类型所有的内置方法

    随便看看 """ forList(): 测试list和enumerate()函数 examineFun(): 查看数据类型所有的内置方法 ""&quo ...