我在技术面试中被问过这个问题,如果我的答案完全错误,我想知道.
面试官要我分两个清单.这是一个例子
[1, 2, 3, 4], [1, 2, 3] => [4]
[1, 2, 2, 2], [1, 2] => [2, 2]
[1, 2, 2, 2], [1, 2, 3, 3] => [2, 2]
def diff_two_list(list1, list2):
hash_map1 = {}
for i in list1:
hash_map1[i] = hash_map1.get(i, 0) + 1
hash_map2 = {}
for j in list2:
hash_map2[j] = hash_map2.get(j, 0) + 1
result = []
for i in hash_map1.keys():
if i not in hash_map2:
for _ in range(hash_map1[i]):
result.append(i)
else:
remained_value = hash_map1[i] - hash_map2[i]
if remained_value > 0:
for _ in range(remained_value):
result.append(i)
return result
Run Code Online (Sandbox Code Playgroud)
我意识到这不是最好的代码.我想知道我的解决方案是否完全错误?这个解决方案的时间复杂度是多少.我想在codereview.stackexchange.com中询问这个问题,但他们说代码必须正确才能要求审核,所以我要求在这个房间里.
我回答的时间复杂性是 2o(n)
在面试工作时,面试官正在寻找有关候选人的许多事情.一些例子:
面试官要求你在两个列表之间做差异并提供一个解决方案集.我查看了数据并将其解释为左侧数组与右侧数组的位置比较,其中:
如果你长时间盯着测试用例,你可能会想出其他的解释.
我希望最好的候选人可以提出有关数据集的问题或解释问题解释和边缘情况背后的假设.
对于这样一个简单的问题,我希望最好的候选人能够编写一些你可以快速理解的代码而无需花费大量精力来思考代码正在做什么.
我希望最好的候选人能够根据他们的假设以时间或空间有效的方式解决问题.
在这种情况下,我希望候选人会创建一个O(n)解决方案.
作为一名面试官,我认为你的答案难以理解且效率低下.通过嵌套循环,您的解决方案可能不是O(n).
我可能不会花太多时间来弄清楚你的解决方案的时间复杂性或它是否会起作用.我会提出问题以确保问题相当清楚,然后继续讨论下一个技巧或适合的问题.
我会解决如下问题:
test_cases = [
[[1, 2, 3, 4], [1, 2, 3], [4]],
[[1, 2, 2, 2], [1, 2], [2, 2]],
[[1, 2, 2, 2], [1, 2, 3, 3], [2, 2]]
]
def left_diff_array(left, right):
smallest_length = min(len(left), len(right))
differences = []
for x in range(1, smallest_length):
if left[x] != right[x]:
differences.append(left[x])
if len(left) > len(right):
differences += left[len(right):]
return differences
for test in test_cases:
first, second, answer = test
assert(left_diff_array(first, second) == answer)
print first, second, "=>", answer
Run Code Online (Sandbox Code Playgroud)