【问题标题】:Kattis 'Digits' question: Why does my first set of code exceed time limit, but my second set does not?Kattis 'Digits' 问题:为什么我的第一组代码超过了时间限制,但我的第二组没有?
【发布时间】:2022-01-25 10:16:13
【问题描述】:

我目前在 Kattis (https://open.kattis.com/problems/digits) 上做一个问题。

任务说明如下:

给定任意数 x0,使用以下递归式定义一个序列 xi+1=xi 的十进制表示中的位数 你的任务是确定最小的正数 i 使得 xi=xi−1。

我最初想出了代码A,但是在代码A未能满足时间限制后,我稍微修改了代码以达到代码B。

示例输入

42
5
END

样本输出

3
2

代码 A:

#time limit exceeded
def recurrence_index(prev):
    counter = 1
    while True:
        current = len(str(prev))
        if current == prev:
            return counter
        else:
            counter += 1
            prev = current
    

while True:
    initial = input().strip()
    if initial == 'END':
        break
    initial = int(initial)
    print(recurrence_index(initial))

代码 B:

def recurrence_index(prev):
    counter = 2
    while True:
        current = len(str(prev))
        if current == prev:
            return counter
        else:
            counter += 1
            prev = current
    

while True:
    initial = input().strip()
    if initial == 'END':
        break
    l = len(initial)
    if l == 1 and int(initial) == 1:
        print(1)
    else:
        print(recurrence_index(l))

不幸的是,我不太清楚为什么代码 B 比代码 A 快。看来我是靠运气得出了正确的答案。如果有人可以帮助解释为什么代码 B 比代码 A 快,您的帮助将不胜感激。谢谢!

【问题讨论】:

  • “看来我是靠运气得出了正确的答案。* - 不,您似乎准确地确定了问题所在并解决了问题。
  • @KellyBundy 嗯我不太清楚为什么我基本上是在搞乱参数以试图使代码更快;代码 B 与代码 A 的唯一不同之处在于,代码 B 将比代码 A 更快地解决初始输入 1。但是,我认为节省的时间将是微不足道的,因为其中一个测试用例有一个 googol 数字。

标签: python kattis


【解决方案1】:

在第一个代码中,int(initial) 在巨大的整数上是昂贵的,而这种努力被抛弃了,因为你最终只是在它上面调用 str(),这也可能是昂贵的。

在第二个代码中,您只需直接调用 len(initial),因此您只会在小于 100 万的小整数上调用 str(),以获得小于 len("1000000")==7 的长度。

【讨论】:

  • 好的,谢谢!
  • 我应该说 100 万,而不是 100,但是 str() 只需要创建一个长度最多为 7 的字符串(最坏的情况下只是“1000000”)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-01-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多