Airbnb电面挂经

Viewed 44

Recruiter reach out. 我就随便面面,没时间刷题。果然就没面过电面。Recruiter竟然没有介绍职位是什么。
题目原文没来及保存,大致说一下总体的结构。

用户订Airbnb的时候,如果所选的行程没有一个连续available的Airbnb,那么可以把行程拆成两段,分别住在两个Airbnb里。输入有两个,第一个是一系列Airbnb的availability, 第二个是用户行程的起止日期。输出所有可行的行程组合。输入里的数字可以视为是抽象的日期,不用考虑现实中的日月。

Input:
airbnbs = {
  "Airbnb A": [1, 2, 3, 5, 6, 9, 10],
  "Airbnb B": [3, 4, 5, 6, 9, 10],
  "Airbnb C": [7, 8, 9, 10, 11],
}
dates = [3, 11]
Output:
results = ["Airbnb B", "Airbnb C"]

一开始写了一大堆啰嗦的代码,没跑对。后来面试官提示了一下,因为行程最多分成两段,所以第一段必然要包含起始日期,第二段必然要包含结尾日期。按照这种思路,解法是先找出所有包含起始日期的Airbnb, 再找出所有包含结尾日期的Airbnb, 然后两两组合,找出组合起来两段能接上(也可以有重叠)的组合。不过这应该不是最优解。面试官也不置可否。

后来让AI写了一下,Claude直接给了一种看似暴力但很简洁的方法,用set存availability, 然后做并集,看是否覆盖行程的起止日期。片段如下,

two_airbnb_solutions = []
airbnb_names = list(airbnbs.keys())
    
for i in range(len(airbnb_names)):
    for j in range(i + 1, len(airbnb_names)):
        airbnb1 = airbnb_names[i]
        airbnb2 = airbnb_names[j]
            
        combined_days = set(airbnbs[airbnb1]) | set(airbnbs[airbnb2])
        if travel_days.issubset(combined_days):
            two_airbnb_solutions.append((airbnb1, airbnb2))

但是这个解法的时间复杂度貌似也是O(n^2)的,暂时没有想到什么更好的方法。如果评论区有大佬想到,请指教。

1 Answers

AI写的感觉很对,但是有些具体实现(issubset,set),是不是面试官会期待要答题人手搓?
手搓倒是不难就是了。

Related Experiences