药铺 最新6道OA整理 + 详解 + 代码

楼主7月14日海投,7月17日收到OA,7月23日完成。
之前准备了4道最近的OA题,无奈碰上的是新题,好在题不难还是完成了。加上OA practice和OA一共6道题。
论坛里练习的4道题目和真题有可能有些许偏差,毕竟我也没有见过真题,不过大致意思肯定是没有问题的。
题目列表:

  1. Active Business
  2. Business Location
  3. Business Response Rate
  4. Reachable Business
  5. Unique Meals (OA practice)
  6. Business Open Hours Ratio (OA)

  1. Active Business
    题目说的是输入一些事件,事件的属性包括类型(photo_view, ads, page_views, reviews 四种), 次数,Business ID当一个Business有两种事件的次数等于或超过该事件在所有Business中次数的平均值,那么视这个事件为ActiveBusiness。
    要求输出所有ActiveBusiness的Business ID。
    相同Business ID的相同事件只会有一个条目记录总次数。
    举个例子:
    events.add(new Event(“ads”, 7, 3));
    events.add(new Event(“ads”, 8, 2));
    events.add(new Event(“ads”, 5, 1));
    events.add(new Event(“page_views”, 11, 2));
    events.add(new Event(“page_views”, 12, 3));
    events.add(new Event(“photo_views”, 10, 1));
    events.add(new Event(“reviews”, 7, 2));
    上面的事件中可以确定2和3是active business,因为ads事件的平均次数是 7 + 8 + 5 / 3 = 6.67,page_views是 11 + 12 / 2 = 11.5,photo_views是10,reviews是7。
    2的ads和reviews满足条件,3的ads和page_views满足条件,但是1只有一个photo_views满足。(有两个或两个以上类型满足就算)
    解法:
    a. 遍历事件List计算每种事件的平均次数,并使用 Map<Integer, Integer[]> 将每个Business ID和其四种事件次数存入HashMap。
    b. 遍历HashMap将满足条件的Business ID存入结果List并返回。

  2. Business Location
    题目的意思是输入一堆stores,里面存了商店名称,城市,ID。一个城市可能有多个不同ID但是相同名字的store。
    输出一个List,里面是某个城市拥有的所有store名称和对应的数量,按照数量从少到多排列(这里存疑,不知道是从少到多还是从多到少),如果数量相同则按照字母顺序排列。
    像这样:
    stores.add(new Store(“Walmart”, “San Jose”, 1));
    stores.add(new Store(“Walmart”, “Los Angeles”, 2));
    stores.add(new Store(“Bestbuy”, “San Jose”, 3));
    stores.add(new Store(“Bestbuy”, “Los Angeles”, 4));
    stores.add(new Store(“Bestbuy”, “Dallas”, 5));
    stores.add(new Store(“Bed&Bath”, “San Jose”, 6));
    stores.add(new Store(“Bestbuy”, “San Jose”, 7));
    stores.add(new Store(“Bestbuy”, “San Jose”, 8));
    stores.add(new Store(“Walmart”, “San Jose”, 9));
    stores.add(new Store(“Walgreen”, “San Jose”, 10));
    stores.add(new Store(“Walgreen”, “San Jose”, 11));
    如果需要查询San Jose则返回:
    Bed&Bath:1
    Walgreen:2
    Walmart:2
    Bestbuy:3

解法:
a. 遍历stores将要查询的城市的所有商店名称和对应的数量用HashMap存下来。
b. 使用List<Map.Entry<String,Integer>>将HashMap排序保存并返回(需要自己写Comparator)。

  1. Business Response Rate
    输入一堆Messages,其中包括发送人ID,收件人ID和对话ID。要求输出某一个ID对他收到的信息进行回复的比率。
    举个例子:42号给1号发了一个信息,1号又给42号发了一个信息,并且两条信息是同一个对话ID,那么视为1号回复了42号。

解法:
a. 遍历第一遍,用一个Map存储该ID发送的所有信息的对话ID和收件人,用另一个Map存储该ID收到的所有信息的对话ID和发件人。
b. 遍历收到信息的Map,在发送的Map中查找是否有回复。

  1. Reachable Business
    就是给你一个加权无向图,输出从一个点出发在一定距离之内能到达的所有点。
    解法:
    a. 使用BFS算法,从起点出发,使用HashMap存储到达每个点需要的距离。
    b. 如果HashMap里已经有了对应点的entry则比较新的距离是否小于原来Map中存储的,保持Map为最小距离。

  2. Unique Meals (OA practice) 见图片

解法:
a. 将每个meal的ingredients按照字母排序。
b. 使用HashSet存储ingredients,最后输出HashSet.size()。

  1. Business Open Hours Ratio (OA) 见图片

解法:
a. 商店的TimeRange和用户查询的Query只会有四种情况:
TimeRange完全包含Query,Query完全包含TimeRange,TimeRange和Query部分重合(TimeRange开始时间在Query外但是结束时间在Query内,TimeRange开始时间在Query内但是结束时间在Query外)。
b. 遍历List,看符合哪种情况,并计算有效时间,最后返回有效时间的总和。

Time Range的代码我写过一个,不保证能过所有的case,我不是这个题。 [1]代表end [0]代表start

补充一个新看到的题 Active Business