foob​​ar挑战卡在素数位置上

时间:2018-04-26 23:39:07

标签: python-2.7 list-comprehension google-foobar

我现在很难被分配了 给定N在一串素数中找到N + 4个字符的位置。 例如,一串素数是23571113 ...

所以:
n = 3 号码是= 71113

n = 0 号码是= 23571

n不能大于10000

这是我的代码,我把我的大脑围绕着有效率但是当我尝试做10000的测试用例时,它花了太长时间,这就是为什么我认为我在10个测试用例中有4个失败了:

def answer(n):
    # your code here
    n = int(n)
    ID_len = 0
    input_limit = 10000  # adjustable limit for n
    y = 0 # Counter
    if n<= input_limit: #checks to make sure you're under the limit of 10000 for n
        try:
            while (ID_len < (n+5)):
                    y += 2
                    primes = [x for x in range(2, y + 1) if all(x%i for i in range(2,x))]
                    prime_str = ''.join(map(str,primes))
                    ID_len = len(prime_str)
            #print prime_str
            return  prime_str[n:n+5]
        except:
            pass
    else:
        print ("pick a number smaller than {0}".format(input_limit))

我可以做些什么来提高效率,或者我只是过度思考这个问题?

2 个答案:

答案 0 :(得分:1)

有点晚......正如您所注意到的,您不必在每次迭代时计算primes:只需将其移出循环并将y替换为列表中的适当值理解。但为什么要保持计算?如果您不受房间限制,您可以写下:

prime_str = "23579..." # 10000 chars here

我们假设这不被接受。您的代码至少有两项基本改进:

  • 您无需构建完整的prime_str;
  • 你可以紧固primes代。

第一项改进:

N = n+5
s = " "*10 # a slice large enough
for prime in primes(): # a generator of primes (see below)
    prime_str = str(prime)
    N -= len(prime_str)
    # add the prime at the end of the slice, 
    # remove chars at the beginning to keep the size
    s = s[len(prime_str):] + prime_str        
    if N<0:
        return s[N-5:N] # return the correctp part of the slice.

第二个改进。当然,你可以实施Erathostenes筛, 这可能是矫枉过正的。有一个简单的想法:如果是a = b * c,那么b >= sqrt(a)c >= sqrt(a)。因此,当您到达a时,您可以停止查找sqrt(a)的除数:

def primes():
    return (x for x in itertools.count(2) if all(x % i != 0 for i in range(2, math.ceil(math.sqrt(x))+1)))

答案 1 :(得分:0)

噢,我想我注意到每个循环试图重做已经完成的范围的问题。我需要保持字符串中最后一个素数的计数器并从那里开始。