Python ';由于超时而终止';
为什么此代码在Hackerrank上显示“由于超时而终止” 我试图在Hackerrank上的30天代码中执行一项任务:按位和。任务如下: 任务 给定集S={1,2,3,N}。从集合S中找到两个整数,A和B(其中AB),使得A和B的值是可能的最大值,也小于给定整数K。在这种情况下,&表示按位AND运算符 输入格式 第一行包含一个整数,T,即测试用例的数量。每个T后续行将测试用例定义为2 空间分隔整数,N和K 约束 小于K的(某物)的最大值应为K-1。除非因为某种原因不可能Python ';由于超时而终止';,python,python-3.x,bitwise-operators,Python,Python 3.x,Bitwise Operators,为什么此代码在Hackerrank上显示“由于超时而终止” 我试图在Hackerrank上的30天代码中执行一项任务:按位和。任务如下: 任务 给定集S={1,2,3,N}。从集合S中找到两个整数,A和B(其中AB),使得A和B的值是可能的最大值,也小于给定整数K。在这种情况下,&表示按位AND运算符 输入格式 第一行包含一个整数,T,即测试用例的数量。每个T后续行将测试用例定义为2 空间分隔整数,N和K 约束 小于K的(某物)的最大值应为K-1。除非因为某种原因不可能 让我们来看看: for
让我们来看看:
for n in range(2, 256):
for k in range(2, n + 1):
m = max(a & b for a in range(1, n + 1) for b in range(a + 1, n + 1) if a & b < k)
t = "*" if m == k - 1 else " "
print("{:s} {:3d} {:3d} {:3d} {:08b} {:08b} {:08b} {:3d} {:3d}".format(t, n, k, m, n, k, m, n - k, k - m))
显然,最大值通常是K-1(带星号的行),因此可能更容易确定何时不是K-1。此外,最大值似乎是K-1或K-2
另一个测试,仅当最大值不是K-1时显示。这次我们先按K排序,然后按N排序
for k in range(2, 256):
for n in range(k, 256):
m = max(a & b for a in range(1, n + 1) for b in range(a + 1, n + 1) if a & b < k)
if m != k - 1:
print("{:3d} {:3d} {:3d} {:08b} {:08b} {:08b} {:3d} {:3d}".format(n, k, m, n, k, m, n - k, k - m))
因此,当max不是K-1时,它似乎总是K-2,并且K必须是偶数。
考虑<代码> k=2 **p/代码> p>0,以简化(即,忘记k的更高的比特,对于偶数k)。“自然”最大值应为K-1,即2**p-1
示例:
在二进制中,K=1000时,自然最大值为111。但是如果我们手头上所有的A和B的值都小于K,这是不可能的:B的最大值是111,但是A必须更小,所以至少会丢失一位。最大值将是110,即K-2
当N不大于1000时会出现这个问题:如果它足够大,那么我们有足够的A和B值来得到A&B=111。具体来说,如果N至少是1111,那么A=111和B=1111,我们就完成了
当K不是二的幂时,它只是稍微复杂一点
现在,您应该有所有必要的部分要完成
最后一次检查
def p2(k):
p = 1
while k % (2 * p) == 0:
p *= 2
return p
count1 = count2 = 0
for k in range(2, 256):
print("-" * 60)
for n in range(k, 256):
m = max(a & b for a in range(1, n + 1) for b in range(a + 1, n + 1) if a & b < k)
t1 = "*" if m == k - 1 else " "
if k % 2 == 0:
p = p2(k)
t2 = "*" if n <= k + p - 2 and m == k - 2 else " "
else:
t2 = " "
if t1 == t2:
count1 += 1
else:
count2 += 1
print("{:s} {:s} {:3d} {:3d} {:3d} {:08b} {:08b} {:08b} {:3d} {:3d}".format(t1, t2, n, k, m, n, k, m, n - k, k - m))
print(count1, count2)
defp2(k):
p=1
当k%(2*p)==0时:
p*=2
返回p
count1=count2=0
对于范围内的k(2256):
打印(“-”*60)
对于范围内的n(k,256):
m=最大值(a和b
总而言之:
如果N>=K |(K-1),则最大值为K-1,否则为K-2。小于K的(某物)的最大值应为K-1。除非因为某种原因不可能
让我们来看看:
for n in range(2, 256):
for k in range(2, n + 1):
m = max(a & b for a in range(1, n + 1) for b in range(a + 1, n + 1) if a & b < k)
t = "*" if m == k - 1 else " "
print("{:s} {:3d} {:3d} {:3d} {:08b} {:08b} {:08b} {:3d} {:3d}".format(t, n, k, m, n, k, m, n - k, k - m))
显然,最大值通常是K-1(带星号的行),因此可能更容易确定何时不是K-1。此外,最大值似乎是K-1或K-2
另一个测试,仅当最大值不是K-1时显示。这次我们先按K排序,然后按N排序
for k in range(2, 256):
for n in range(k, 256):
m = max(a & b for a in range(1, n + 1) for b in range(a + 1, n + 1) if a & b < k)
if m != k - 1:
print("{:3d} {:3d} {:3d} {:08b} {:08b} {:08b} {:3d} {:3d}".format(n, k, m, n, k, m, n - k, k - m))
因此,当max不是K-1时,它似乎总是K-2,并且K必须是偶数。
考虑<代码> k=2 **p/代码> p>0,以简化(即,忘记k的更高的比特,对于偶数k)。“自然”最大值应为K-1,即2**p-1
示例:
在二进制中,K=1000时,自然最大值为111。但是如果我们手头上所有的A和B的值都小于K,这是不可能的:B的最大值是111,但是A必须更小,所以至少会丢失一位。最大值将是110,即K-2
当N不大于1000时会出现这个问题:如果它足够大,那么我们有足够的A和B值来得到A&B=111。具体来说,如果N至少是1111,那么A=111和B=1111,我们就完成了
当K不是二的幂时,它只是稍微复杂一点
现在,您应该有所有必要的部分要完成
最后一次检查
def p2(k):
p = 1
while k % (2 * p) == 0:
p *= 2
return p
count1 = count2 = 0
for k in range(2, 256):
print("-" * 60)
for n in range(k, 256):
m = max(a & b for a in range(1, n + 1) for b in range(a + 1, n + 1) if a & b < k)
t1 = "*" if m == k - 1 else " "
if k % 2 == 0:
p = p2(k)
t2 = "*" if n <= k + p - 2 and m == k - 2 else " "
else:
t2 = " "
if t1 == t2:
count1 += 1
else:
count2 += 1
print("{:s} {:s} {:3d} {:3d} {:3d} {:08b} {:08b} {:08b} {:3d} {:3d}".format(t1, t2, n, k, m, n, k, m, n - k, k - m))
print(count1, count2)
defp2(k):
p=1
当k%(2*p)==0时:
p*=2
返回p
count1=count2=0
对于范围内的k(2256):
打印(“-”*60)
对于范围内的n(k,256):
m=最大值(a和b
总而言之:
如果N>=K |(K-1),则最大值为K-1,否则为K-2。您的代码不是最佳的。。。我会去codereview.stackexchange他们可能更擅长优化这些东西。。。首先,我认为如果列表1是一个生成器,可能会稍微快一点。。。您可能还可以通过某种方法消除测试集中的大块内容,只要您能帮助我就可以了!笔、纸、脑。在编写任何代码之前使用它们。A&B成为max意味着什么?什么时候发生?小N和小K的几个例子是什么?有一个模式吗?实际上,你可能不需要任何搜索就可以解决这个问题。你只需要做一个仔细的案例分析,看看期望的结果是什么形式。所以可能有一个O(1)的解决方案。请更具体地解释一下,我只是初学者,你的代码并没有它可能是最佳的。。。我会去codereview.stackexchange他们可能更擅长优化这些东西。。。首先,我认为如果列表1是一个生成器,可能会稍微快一点。。。您可能还可以通过某种方法消除测试集中的大块内容,只要您能帮助我就可以了!笔、纸、脑。在编写任何代码之前使用它们。A&B成为max意味着什么?什么时候发生?