Easy interview question got harder: given numbers 1..100, find the missing number(s) given exactly k are missing

前端 未结 30 2068
时光说笑
时光说笑 2020-11-22 07:02

I had an interesting job interview experience a while back. The question started really easy:

Q1: We have a bag containing numbers

30条回答
  •  予麋鹿
    予麋鹿 (楼主)
    2020-11-22 07:50

    You can solve Q2 if you have the sum of both lists and the product of both lists.

    (l1 is the original, l2 is the modified list)

    d = sum(l1) - sum(l2)
    m = mul(l1) / mul(l2)
    

    We can optimise this since the sum of an arithmetic series is n times the average of the first and last terms:

    n = len(l1)
    d = (n/2)*(n+1) - sum(l2)
    

    Now we know that (if a and b are the removed numbers):

    a + b = d
    a * b = m
    

    So we can rearrange to:

    a = s - b
    b * (s - b) = m
    

    And multiply out:

    -b^2 + s*b = m
    

    And rearrange so the right side is zero:

    -b^2 + s*b - m = 0
    

    Then we can solve with the quadratic formula:

    b = (-s + sqrt(s^2 - (4*-1*-m)))/-2
    a = s - b
    

    Sample Python 3 code:

    from functools import reduce
    import operator
    import math
    x = list(range(1,21))
    sx = (len(x)/2)*(len(x)+1)
    x.remove(15)
    x.remove(5)
    mul = lambda l: reduce(operator.mul,l)
    s = sx - sum(x)
    m = mul(range(1,21)) / mul(x)
    b = (-s + math.sqrt(s**2 - (-4*(-m))))/-2
    a = s - b
    print(a,b) #15,5
    

    I do not know the complexity of the sqrt, reduce and sum functions so I cannot work out the complexity of this solution (if anyone does know please comment below.)

提交回复
热议问题