首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >编解码室劫匪在ide与leetcode上的不同输出

编解码室劫匪在ide与leetcode上的不同输出
EN

Stack Overflow用户
提问于 2022-06-19 19:57:06
回答 1查看 99关注 0票数 -4

下面的代码在我的IDE中给出了正确的答案,但是在leetcode输出中给出了错误的答案。

代码语言:javascript
复制
def rob(nums, current=0, memo={}):
    if current >= len(nums):
        return 0
    if current in memo:
        sum1 = memo[current]
    else:
        sum1 = nums[current] + rob(nums, current + 2)
        memo[current] = sum1
    
    if current + 1 >= len(nums):
        return sum1
    if current + 1 in memo:
        sum2 = memo[current + 1]
    else:
        sum2 = nums[current + 1] + rob(nums, current + 3)
        memo[current + 1] = sum2
    return max(sum1, sum2)

投入: 2,7,9,3,1

IDE输出: 12 (正确答案)

leetcode输出:4(错误答案)

为什么会发生这种事?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-06-19 20:16:46

问题在于memo={}。当您只运行一个测试时,它将在本地工作(当您在一个特定的输入上运行它时,它也会在LeetCode上运行),但是当您使用不同的nums输入运行多个函数调用时,您也会得到意想不到的结果。

memo只被分配一次{},并且不会被它重置。此字典只创建一次,该字典将作为下一次调用中的默认值。如果函数改变了该字典,那么下一个调用(不带memo参数)将得到该变异字典作为初始化值。这就是Python中默认参数值的工作方式。

你可以这样解决:

代码语言:javascript
复制
def rob(nums, current=0, memo=None):
    if memo is None:
        memo = {}
    # Rest of your code, but PASS the memo argument!
    if current >= len(nums):
        return 0
    if current in memo:
        sum1 = memo[current]
    else:
        sum1 = nums[current] + rob(nums, current + 2, memo)
        memo[current] = sum1
    
    if current + 1 >= len(nums):
        return sum1
    if current + 1 in memo:
        sum2 = memo[current + 1]
    else:
        sum2 = nums[current + 1] + rob(nums, current + 3, memo)
        memo[current + 1] = sum2
    return max(sum1, sum2)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72679931

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档