Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/354.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python ';由于超时而终止';_Python_Python 3.x_Bitwise Operators - Fatal编程技术网

Python ';由于超时而终止';

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

为什么此代码在Hackerrank上显示“由于超时而终止”

我试图在Hackerrank上的30天代码中执行一项任务:按位和。任务如下:

任务

给定集S={1,2,3,N}。从集合S中找到两个整数,AB(其中AB),使得A和B的值是可能的最大值,也小于给定整数K。在这种情况下,&表示按位AND运算符

输入格式

第一行包含一个整数,T,即测试用例的数量。每个T后续行将测试用例定义为2 空间分隔整数,NK

约束

小于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。

小于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意味着什么?什么时候发生?