zoukankan      html  css  js  c++  java
  • 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题解:

      1 //游戏的规则是把所有的动作执行之后再判断状态,每个回合之中的所有动作没有先后之分。
      2 import java.util.*;
      3 
      4 public class testAirBnB {
      5     static List<String> evaluateActions(List<String> actions) {
      6         Map<String, army> armies = new TreeMap();
      7         Map<String, city> cities = new HashMap<>();
      8         ArrayList<String[]> manu = new ArrayList<>();
      9         ArrayList<String[]> supportList = new ArrayList<>();
     10 
     11         for (String action : actions) {
     12             //将每个aciton拆解
     13             String[] s = action.split(" ");
     14             //注册每个军队
     15             army a = new army(s[0]);
     16             armies.put(s[0], a);
     17             manu.add(s);
     18         }
     19 
     20         for (String[] str : manu) {
     21             //遍历每个action, 执行每个action
     22             //获取当前action的执行主体军队
     23             army a = armies.get(str[0]);
     24             //记录该军队当前所在城市
     25             a.whereNow = str[1];
     26             //保存目前军队所在城市
     27             city tmpCity;
     28 
     29             //为a当前所在的城市注册,如果记录中不存在该城市,新建一个记录,并将a军队加入其hold军队表
     30             if (!cities.containsKey(a.whereNow)) {//该城市之前未被注册过
     31                 tmpCity = new city(a.whereNow, a.strength, a.name);
     32                 cities.put(a.whereNow, tmpCity);
     33             } else {
     34                 //该城市之前注册过,但因为之前的战斗所有军队都死亡,现在可以重新hold;这里假设
     35                 //所有的操作都是有效的,即不存在向已有军队驻扎的城市hold的action发生
     36                 tmpCity = cities.get(a.whereNow);
     37                 tmpCity.holdArmies.put(a.name, a.strength);
     38             }
     39 
     40             if (str[2].equals("Hold")) {
     41                 //keep default;
     42             } else if (str[2].equals("Move")) {
     43                 //从当前的城市撤退
     44                 tmpCity.holdArmies.remove(a.name);
     45                 //进军到目的城市
     46                 a.whereNow = str[3];
     47                 //如果要去的城市已经被注册,直接加入驻扎名单
     48                 if (cities.containsKey(a.whereNow)) {
     49                     tmpCity = cities.get(a.whereNow);
     50                     tmpCity.holdArmies.put(a.name, a.strength);
     51                 }
     52                 //否则说明要去的城市未被驻扎过,直接注册该城市并记录驻扎信息
     53                 else {
     54                     tmpCity = new city(a.whereNow, a.strength, a.name);
     55                     cities.put(a.whereNow, tmpCity);
     56                 }
     57 
     58 
     59             } else if (str[2].equals("Support")) {
     60                 //必须等到所有的军队移动完毕才能确定是否可以增援
     61                 supportList.add(str);
     62 //                //为友军加buf
     63 //                army friend = armies.get(str[3]);
     64 //                friend.strength++;
     65 //                //更新友军所在城市注册表中友军的strength
     66 //                city friendCity = cities.get(friend.whereNow);
     67 //                friendCity.holdArmies.put(friend.name, friend.strength);
     68             }
     69         }
     70 
     71         //处理增援
     72         //如果A没有underAttack, 则可以增援
     73         //否则不可以增援
     74         for(String[] sptAction: supportList){
     75             //如果A所在城市的驻扎军队大于1只,说明A正在underAttack, A的增援行动无效
     76 
     77             if(cities.get(armies.get(sptAction[0]).whereNow).holdArmies.size()>1)
     78                 continue;
     79             //否则增援有效
     80             else{
     81                 //为友军加buf
     82                 army friend = armies.get(sptAction[3]);
     83                 friend.strength++;
     84                 //更新友军所在城市注册表中友军的strength
     85                 city friendCity = cities.get(friend.whereNow);
     86                 friendCity.holdArmies.put(friend.name, friend.strength);
     87             }
     88         }
     89 
     90         //跟据城市来判断每只军队的生存状况
     91         for (city tmpCity : cities.values()) {
     92             //当前城市的驻扎军队少于两支,不会发生战争
     93             if (tmpCity.holdArmies.size() < 2)
     94                 continue;
     95                 //驻扎军队大于两支
     96 
     97             else {
     98                 List<Map.Entry<String, Integer>> list = new ArrayList<>(tmpCity.holdArmies.entrySet());
     99 //                按treeMap的值从大到小排序
    100                 Collections.sort(list, new Comparator<Map.Entry<String, Integer>>() {
    101                     @Override
    102                     public int compare(Map.Entry<String, Integer> o1, Map.Entry<String, Integer> o2) {
    103                         return -o1.getValue().compareTo(o2.getValue());
    104                     }
    105                 });
    106                 //如果该城市的驻扎军队表中战力靠前的两支军队的战力相等,则驻扎在该城市的所有军队都回死亡(包括战力更低的)
    107                 if (list.get(0).getValue().equals(list.get(1).getValue())) {
    108                     //该城市所有军队都死亡
    109                     for (int i = 0; i < list.size(); i++) {
    110                         armies.get(list.get(i).getKey()).isAlive = false;
    111                     }
    112                 } else {
    113                     //否则除了第一支军队(战力最高的军队),其余军队死亡
    114                     for (int i = 1; i < list.size(); i++) {
    115                         armies.get(list.get(i).getKey()).isAlive = false;
    116 
    117                     }
    118                 }
    119             }
    120         }
    121 
    122         // 循环检查每个城市的状态,如果isAlive为false, 输出城市名+[dead]
    123         // 否则输出城市名+whereNow
    124         List<String> result = new ArrayList<>();
    125         for (army unit : armies.values()) {
    126             //如果状态标记为dead,直接输出
    127             if (!unit.isAlive)
    128                 result.add(unit.name + " " + "[dead]");
    129             else {
    130                 result.add(unit.name + " " + unit.whereNow);
    131             }
    132         }
    133 
    134         for (String s : result)
    135             System.out.println(s);
    136 
    137         return result;
    138     }
    139 
    140     public static void main(String[] args) {
    141 
    142         List<String> input = new ArrayList<>();
    143         //测试数据1
    144 //        input.add("A Munich Hold");input.add("B Warsaw Move Bohemia");
    145         //测试数据2
    146         input.add("A Munich Hold");input.add("B Bohemia Move Munich");input.add("C Warsaw Support B");
    147         //测试数据3
    148 //        input.add("A Munich Hold");input.add("B Bohemia Move Munich");input.add("C Prussia Move Munich");input.add("D Warsaw Hold");
    149         //测试数据4
    150 //        input.add("A Munich Support B");input.add("B Bohemia Move Prussia");input.add("C Prussia Hold");input.add("D Warsaw Move Munich");
    151         //测试数据5
    152 //        input.add("A Munich Support B");input.add("B Oakland Move Munich");
    153         evaluateActions(input);
    154     }
    155 
    156     static class army {
    157         String name;
    158         String whereNow;
    159         int strength = 1;
    160 //        boolean underAttack = false;
    161         boolean isAlive = true;
    162 
    163         army(String _name) {
    164             name = _name;
    165         }
    166     }
    167 
    168     static class city {
    169         String name;
    170         TreeMap<String, Integer> holdArmies = new TreeMap<>();
    171 
    172         city(String city_name, int strength, String army_name) {
    173             name = city_name;
    174             holdArmies.put(army_name, strength);
    175         }
    176     }
    177 
    178 }
    TALK IS CHEAP, SHOW ME THE CODE
  • 相关阅读:
    SDWebImage
    ios面试题
    IOS推送功能push
    NSString什么时候用copy,什么时候用strong
    OC点语法和变量作用域
    iOS 常用几种数据存储方式
    JSON与XML的区别比较
    IOS开发——网络编程OC篇&Socket编程
    IOS-UI控件大全
    使用sql语句备份一张表
  • 原文地址:https://www.cnblogs.com/greatLong/p/10676209.html
Copyright © 2011-2022 走看看