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基础,一定要先打 ...
随机推荐
- iptables配置管理
iptables规则 内核netfilter的规则: iptables的规则: 基本操作 实践:往iptables中插入一条规则:禁止基于端口号为22的所有客户端访问(等于是禁止基于SSH的客户端连接 ...
- Springcloud 的Eureka和ZooKeeper比较
关于CAP理论,可以去看看阮一峰的文章[http://www.ruanyifeng.com/blog/2018/07/cap.html] C(一致性)A(可用性)P(分区容错性) ZooKeeper: ...
- java-同步控制及不可变设置(只读访问)
1.还是直接上代码简单了解一下: package com.synchronize.test; import java.util.ArrayList; import java.util.Collecti ...
- 转载:Linux服务器Cache占用过多内存导致系统内存不足最终java应用程序崩溃解决方案
原文链接: https://blog.csdn.net/u014740338/article/details/66975550 问题描述 Linux内存使用量超过阈值,使得Java应用程序无可用内存, ...
- 加载loading对话框的功能(不退出沉浸式效果)
上一篇基于修改系统源码的前提下,实现了完全的沉浸式体验效果.可参考这篇 戳这 一.自定义Dialog 在沉浸式效果下,当界面弹出对话框时,对话框将获取到焦点,这将导致界面退出沉浸式效果,那么是不是能通 ...
- Android 技能图谱学习路线
这里是在网上找到的一片Android学习路线,希望记录下来供以后学习 1Java 基础 Java Object类方法 HashMap原理,Hash冲突,并发集合,线程安全集合及实现原理 HashMap ...
- 电脑一键U盘启动快捷键
下面是我特意列出的品牌电脑.笔记本电脑.组装电脑一键U盘启动快捷键对应列表,仅供大家查阅参考! [品牌-笔记本电脑] 笔记本品牌 启动按键 联想笔记本 F12 宏基笔记本 F12 华硕笔记本 ...
- Linux & Windows 环境下 RabbitMQ 安装与基本配置
索引: 目录索引 参看代码 GitHub: rabbitmq.txt 一.Linux (DeepinOS) 环境 .安装: sudo apt install rabbitmq-server .进入目录 ...
- c/c++ llinux epoll系列4 利用epoll_wait实现非阻塞的connect
llinux epoll系列4 利用epoll_wait实现非阻塞的connect connect函数是阻塞的,而且不能设置connect函数的timeout时间,所以一旦阻塞太长时间,影响用户的体验 ...
- python文件上传
1.前端代码 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UT ...