Python 查找带旋转的最大二进制数,超过时间限制

Python 查找带旋转的最大二进制数,超过时间限制,python,algorithm,suffix-array,Python,Algorithm,Suffix Array,通过了一些测试用例,但在提交后,超过了时间限制。如何优化解决方案以降低时间复杂性 大二进制数由大小为N和的字符串A表示 由0和1组成。您必须对此执行循环移位 一串循环换档操作定义如下: 如果字符串A为[A0,A1,…,An-1],则在执行一个 循环移位,字符串变为[A1,A2,…,An-1,A0] 您执行了无限次移位,每次 记录由字符串表示的二进制数的值。这个 执行(可能为0)后形成的最大二进制数 操作是B。您的任务是确定循环移位的数量 可以执行该操作,以使字符串表示的值 第k次将等于B 输入格

通过了一些测试用例,但在提交后,超过了时间限制。如何优化解决方案以降低时间复杂性

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

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

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

输入格式:

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

输出格式:

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

num\u test\u cases=int(input())
对于范围内的i(num\u测试案例):
数组长度,重复数=map(int,input().split())
计数=0
bin_num=输入()
原始\u bin\u num=bin\u num
dec_num=int(bin_num,2)
最大值=dec_num
dec_num_数组=[dec_num]
对于范围内的j(数组长度-1):
bin_num=bin_num[1::+bin_num[0]
如果bin\u num==原始bin\u num:
打破
dec_num=int(bin_num,2)
dec_num_数组。追加(dec_num)
最大值=最大值(dec\u num\u数组)
maxIndex=dec\u num\u数组索引(最大值)
循环移位数=0
对于范围内的kek(重复次数):
如果kek==0:
num_循环移位+=最大索引
elif len(dec_num_数组)=数组长度:
num_循环移位+=数组长度
elif len(dec_num_数组)<数组长度:
num_循环移位+=len(dec_num_数组)
打印(循环移位数)

既然你要求优化你的代码,我就这样做了。 用公式替换最后一个for循环

num_cyclic_shifts = maxIndex + (len(dec_num_array) * (num_of_repetition-1))
整个代码将成为

num_test_cases = int(input())
for i in range(num_test_cases):
    array_length, num_of_repetition = map(int, input().split())

    count = 0
    bin_num = input()
    original_bin_num = bin_num
    dec_num = int(bin_num, 2)
    maximum = dec_num
    dec_num_array = [dec_num]

    for j in range(array_length - 1):
        bin_num = bin_num[1:] + bin_num[0]
        if bin_num == original_bin_num:
            break
        dec_num = int(bin_num, 2)
        dec_num_array.append(dec_num)
    maximum = max(dec_num_array)
    maxIndex = dec_num_array.index(maximum)
    num_cyclic_shifts = maxIndex + (len(dec_num_array) * (num_of_repetition-1))
    print(num_cyclic_shifts)

可能会有帮助。这些竞争性编程任务总是有一个转折点,使得简单的解决方案(正如您所做的)超过了时间限制。提示:给定长度的最大二进制数是以最长的“1”字符开头的二进制数之一。这确实是一个很好的改进,但您是如何得出该公式的?我在哪里可以得到更多关于它的信息?@Bechma解决方案就在这个for循环中。如果重复次数
number\u
=0,那么我们可以得到移位次数
maxIndex
,因为循环移位将对应于索引。现在,当重复次数
number\u
>0时,我们必须遍历整个
dec\u num\u数组
,所以数组的长度被乘以并添加到
maxIndex
num_test_cases = int(input())
for i in range(num_test_cases):
    array_length, num_of_repetition = map(int, input().split())

    count = 0
    bin_num = input()
    original_bin_num = bin_num
    dec_num = int(bin_num, 2)
    maximum = dec_num
    dec_num_array = [dec_num]

    for j in range(array_length - 1):
        bin_num = bin_num[1:] + bin_num[0]
        if bin_num == original_bin_num:
            break
        dec_num = int(bin_num, 2)
        dec_num_array.append(dec_num)
    maximum = max(dec_num_array)
    maxIndex = dec_num_array.index(maximum)
    num_cyclic_shifts = maxIndex + (len(dec_num_array) * (num_of_repetition-1))
    print(num_cyclic_shifts)