Python 具有代码执行时间限制的字符串排序问题
我最近试图解决一个黑客问题。代码处理了示例输入和我提供的一些自定义输入。但是,当我提交时,它显示了超过时限的错误。有人能解释一下我如何让代码运行得更快吗 问题陈述:循环移位 大二进制数由大小为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 代码: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。您
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
,请附加