Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/299.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/4/algorithm/10.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_Algorithm_Python 3.x_Big O_Time Complexity - Fatal编程技术网

Python 适当的数字|有助于降低时间复杂性

Python 适当的数字|有助于降低时间复杂性,python,algorithm,python-3.x,big-o,time-complexity,Python,Algorithm,Python 3.x,Big O,Time Complexity,我必须找到最大的有N个数字的“体面数字”。正数具有以下属性: => 3, 5, or both as its digits. No other digit is allowed. => Number of times 3 appears is divisible by 5. => Number of times 5 appears is divisible by 3. 我的代码工作完美!但我担心这远远不够有效: 输入: 4 #number of test cases, i.e

我必须找到最大的有N个数字的“体面数字”。正数具有以下属性:

=> 3, 5, or both as its digits. No other digit is allowed.
=> Number of times 3 appears is divisible by 5.
=> Number of times 5 appears is divisible by 3.
我的代码工作完美!但我担心这远远不够有效:

输入:

4 #number of test cases, i.e., the following 4 inputs
1
3
5
11
输出:

-1
555
33333
55555533333
我的解决方案版本:

T = int(input()) #number of test cases

def computePair(N):
    multiplesOf3 = [i for i in range(N+1) if i%3 == 0]
    if multiplesOf3 != [0]: #reversing a [0] results in a 'NoneType'
        multiplesOf3.reverse()
    multiplesOf5 = [i for i in range(N+1) if i%5 == 0]

    for i in multiplesOf3:
        for j in multiplesOf5:
            if (i+j) == N:
                return (i, j)
    return -1

for testCase in range(T):
    N = int(input()) #test case
    result = computePair(N)
    if result == -1:
        print(result) #If no such combination exists return '-1'
    else:
        print('5' * (result[0]) + '3' * (result[1]))
我假设我的代码的时间复杂度为O(n^2);因为有两个“for”循环。我希望它在O(n)-线性的顺序下更有效


这是一个非常普遍的问题:另外,您是否有任何资源来确定最佳实践的时间复杂性?我很烂。

要解决这个问题,我们需要做一些观察:

  • 包含N个数字的最大“正数”
    是包含最多数字5的数字。它的表格是5555…3333

  • 由于
    5出现的次数可被3整除,因此我们有三种情况:

    • 如果N除以3,则没有数字3

    • 如果
      N%3=1
      ,那么我们需要将
      a乘以
      第3位,然后
      a%3==1
      使第5位的总数
      (N-a)
      可被3整除,因此
      a%3==1
      a%5==0
      ->
      a=10
      。(请注意,
      a
      必须是所有有效值中最小的)。最终结果将有
      (N-10)
      数字5和
      10
      数字3

    • 类似地,如果
      N%3=2
      ,那么我们需要在结果中添加
      a乘以
      第3位,
      a%3==2
      a%5==0
      ->
      a=5


通过这些观察,你可以用O(1)来解决每个N的问题。

要解决这个问题,我们需要进行一些观察:

  • 包含N个数字的最大“正数”
    是包含最多数字5的数字。它的表格是5555…3333

  • 由于
    5出现的次数可被3整除,因此我们有三种情况:

    • 如果N除以3,则没有数字3

    • 如果
      N%3=1
      ,那么我们需要将
      a乘以
      第3位,然后
      a%3==1
      使第5位的总数
      (N-a)
      可被3整除,因此
      a%3==1
      a%5==0
      ->
      a=10
      。(请注意,
      a
      必须是所有有效值中最小的)。最终结果将有
      (N-10)
      数字5和
      10
      数字3

    • 类似地,如果
      N%3=2
      ,那么我们需要在结果中添加
      a乘以
      第3位,
      a%3==2
      a%5==0
      ->
      a=5


有了这些观察结果,你可以用O(1)为每个N解决这个问题。

如果你在CodeReview上重复了你的问题,请删除这个问题。在我看来,这个问题纯粹是问一个更好的算法,它完全符合主题。如果你在CodeReview上重复了你的问题,请删除这个问题。在我看来,这个问题纯粹是问一个更好的算法,它完全符合主题。显然,当
novidously时,您可以硬编码特殊情况,当
N时,您可以硬编码特殊情况