Python 具有代码执行时间限制的字符串排序问题

Python 具有代码执行时间限制的字符串排序问题,python,arrays,string,sorting,time-limiting,Python,Arrays,String,Sorting,Time Limiting,我最近试图解决一个黑客问题。代码处理了示例输入和我提供的一些自定义输入。但是,当我提交时,它显示了超过时限的错误。有人能解释一下我如何让代码运行得更快吗 问题陈述:循环移位 大二进制数由大小为N的字符串A表示,由0和1组成。必须对此字符串执行循环移位。循环换档操作定义如下: 如果字符串A为[A0,A1,…,An-1],则在执行一次循环移位后,该字符串变为[A1,A2,…,An-1,A0] 您执行了无限次移位,每次都记录了由字符串表示的二进制数的值。执行操作(可能为0)后形成的最大二进制数为B。您

我最近试图解决一个黑客问题。代码处理了示例输入和我提供的一些自定义输入。但是,当我提交时,它显示了超过时限的错误。有人能解释一下我如何让代码运行得更快吗

问题陈述:循环移位

大二进制数由大小为N的字符串A表示,由0和1组成。必须对此字符串执行循环移位。循环换档操作定义如下:

如果字符串A为[A0,A1,…,An-1],则在执行一次循环移位后,该字符串变为[A1,A2,…,An-1,A0]

您执行了无限次移位,每次都记录了由字符串表示的二进制数的值。执行操作(可能为0)后形成的最大二进制数为B。您的任务是确定可以执行的循环移位数,以便字符串A表示的值在第k次等于B

输入格式:

第一行:表示测试用例数量的单个整数T 对于每个测试用例: 第一行:两个空格分隔的整数N和K 第二行:表示字符串的A

输出格式:

对于每个测试用例,打印一行,其中包含一个整数,该整数表示执行的循环移位操作的数量,以使字符串a表示的值在第k次等于B

代码:

import math


def value(s):
    u = len(s)
    d = 0
    for h in range(u):
        d = d + (int(s[u-1-h]) * math.pow(2, h))
    return d


t = int(input())
for i in range(t):
    x = list(map(int, input().split()))
    n = x[0]
    k = x[1]
    a = input()
    v = 0
    for j in range(n):
        a = a[1:] + a[0]
        if value(a) > v:
            b = a
            v = value(a)
    ctr = 0
    cou = 0
    while ctr < k:
        a = a[1:] + a[0]
        cou = cou + 1
        if a == b:
            ctr = ctr + 1
    print(cou)
导入数学
def值:
u=len(s)
d=0
对于范围内的h(u):
d=d+(int(s[u-1-h])*数学功率(2,h))
返回d
t=int(输入())
对于范围(t)内的i:
x=列表(映射(int,input().split())
n=x[0]
k=x[1]
a=输入()
v=0
对于范围(n)内的j:
a=a[1::+a[0]
如果值(a)>v:
b=a
v=值(a)
ctr=0
cou=0
当ctr
我对您发布的代码无能为力,因为您用无意义的变量和缺乏解释来混淆它。当我扫描它时,我得到的印象是,您已经采用了一种简单的方法,在一个长期运行的循环中执行一位数的移位。计算迭代次数,直到第次点击
B

这很容易理解,但繁琐且效率低下

由于循环每隔
N次
迭代重复一次,因此重复该过程不会获得任何新信息。您所需要做的就是找到在一系列
N
迭代中遇到的
B
。。。这可能是多次

为了使
B
多次出现,
A
必须由特定的比特子序列组成,重复2次或更多次。例如,
101010
011011
。您可以通过对当前算法的简单添加来检测这一点:在每次迭代中,检查当前字符串是否与原始字符串匹配。第一次点击此按钮时,只需将重复因子计算为
rep=len(a)/j
。此时,退出换档循环:
b
的当前值是正确的

现在您有了
b
及其在第一个
j
旋转中的位置,您可以直接计算所需的结果,而无需进一步处理

我希望您可以完成算法并从这里开始编码


啊——作为需求描述,您问题的措辞表明
B
是给定的。如果不是,则需要检测最大值

要查找
B
,请将
A
附加到其自身。查找具有最大值的A长度字符串。您可以通过查找
1
s中最长的字符串来加速这一过程,并对这些最大字符串后面的第一个
0
之后的值树应用其他著名的字符串搜索算法


请注意,当您在
A
上迭代时,您会寻找第一个重复原始值的位置:这是所需的重复长度,它驱动了我答案第一部分中的直接计算阶段。

我对您发布的代码无能为力,因为你用无意义的变量和缺乏解释来混淆它。当我扫描它时,我得到的印象是,您已经采用了一种简单的方法,在一个长期运行的循环中执行一位数的移位。计算迭代次数,直到第次点击
B

这很容易理解,但繁琐且效率低下

由于循环每隔
N次
迭代重复一次,因此重复该过程不会获得任何新信息。您所需要做的就是找到在一系列
N
迭代中遇到的
B
。。。这可能是多次

为了使
B
多次出现,
A
必须由特定的比特子序列组成,重复2次或更多次。例如,
101010
011011
。您可以通过对当前算法的简单添加来检测这一点:在每次迭代中,检查当前字符串是否与原始字符串匹配。第一次点击此按钮时,只需将重复因子计算为
rep=len(a)/j
。此时,退出换档循环:
b
的当前值是正确的

现在您有了
b
及其在第一个
j
旋转中的位置,您可以直接计算所需的结果,而无需进一步处理

我希望您可以完成算法并从这里开始编码


啊——作为需求描述,您问题的措辞表明
B
是给定的。如果不是,则需要检测最大值

要查找
B
,请附加