查看: 1195| 回复: 8
跳转到指定楼层
上一主题 下一主题
收起左侧

求问LC 501

全局:

注册一亩三分地论坛,查看更多干货!

您需要 登录 才可以下载或查看附件。没有帐号?注册账号

x
最近在学python 所以看看想用python刷一下题 刷到这题 我觉得我的答案是对的 但是在oj上面会跑出很诡异的结果 求python大神来指导
class PrevNode(object):
        """docstring for PrevNode"""
        def __init__(self):
                self.count = 0
                self.node = None

class Solution(object):
    maxcount = 0
    res = []
    def findMode(self, root):
        """
        :type root: TreeNode
        :rtype: List[int]
        """
        def helper(root, prev):
                if not root: return
                helper(root.left, prev)
                if not prev.node:
                        prev.node, prev.count = root, 1
                elif prev.node.val == root.val:
                        prev.count += 1
                else:
                        if prev.count == Solution.maxcount:
                                Solution.res.append(prev.node.val)
                        elif prev.count > Solution.maxcount:
                                Solution.res = [prev.node.val]
                                Solution.maxcount = prev.count
                        prev.node, prev.count = root, 1

                helper(root.right, prev)
        prev = PrevNode()
        helper(root, prev)
        if prev.count == Solution.maxcount:
                Solution.res.append(prev.node.val)
        elif prev.count > Solution.maxcount:
                Solution.res = [prev.node.val]
        return Solution.res


上一篇:求助一道题,算法加上系统设计
下一篇:面试题求解:一道转换格式的题
🔗
stellari 2017-4-7 08:47:55 | 只看该作者
全局:
在LC上最好不要用class variable,因为不同的test case可能使用的是同一个Solution对象。如果你的算法会改变并依赖于class variable,那么上个test case的运行结果就可能会影响下个test case。
回复

使用道具 举报

🔗
 楼主| 33847682 2017-4-7 08:56:45 | 只看该作者
全局:
stellari 发表于 2017-4-7 08:47
在LC上最好不要用class variable,因为不同的test case可能使用的是同一个Solution对象。如果你的算法会改 ...

原来是这样啊 多谢大神 还有个问题就是如果我在recursion的时候要是想清空list  直接赋值成[] 为啥不行呢?
回复

使用道具 举报

🔗
stellari 2017-4-7 09:11:15 | 只看该作者
全局:
33847682 发表于 2017-4-7 08:56
原来是这样啊 多谢大神 还有个问题就是如果我在recursion的时候要是想清空list  直接赋值成[] 为啥不行呢 ...

举个例子?
回复

使用道具 举报

🔗
 楼主| 33847682 2017-4-7 09:45:16 | 只看该作者
全局:
就比如这题我这么写
class Solution(object):
    maxcount = 0
    def findMode(self, root):
        """
        :type root: TreeNode
        :rtype: List[int]
        """
        def helper(root, prev, res):
                if not root: return
                helper(root.left, prev, res)
                if not prev.node:
                        prev.count, prev.node = 1, root
                elif root.val == prev.node.val:
                        prev.count += 1
                else:
                        if Solution.maxcount == prev.count:
                                res.append(prev.node.val)
                        elif prev.count > Solution.maxcount:
                                res = [prev.node.val]
                                Solution.maxcount = prev.count
                        prev.node = root
                        prev.count = 1
                helper(root.right, prev, res)
        res = []
        prev = PrevNode(0)
        helper(root, prev, res)
        if Solution.maxcount == prev.count:
                res.append(prev.node.val)
        elif prev.count > Solution.maxcount:
                res = [prev.node.val]
        return res
按理来说不是应该list算是object么?应该是传引用的嘛? 可是我debug发现运行完helper函数之后 res还是空的 说明是按值传的?
回复

使用道具 举报

🔗
 楼主| 33847682 2017-4-7 09:46:23 | 只看该作者
全局:

就比如这题我这么写
class Solution(object):
    maxcount = 0
    def findMode(self, root):
        """
        :type root: TreeNode
        :rtype: List[int]
        """
        def helper(root, prev, res):
                if not root: return
                helper(root.left, prev, res)
                if not prev.node:
                        prev.count, prev.node = 1, root
                elif root.val == prev.node.val:
                        prev.count += 1
                else:
                        if Solution.maxcount == prev.count:
                                res.append(prev.node.val)
                        elif prev.count > Solution.maxcount:
                                res = [prev.node.val]
                                Solution.maxcount = prev.count
                        prev.node = root
                        prev.count = 1
                helper(root.right, prev, res)
        res = []
        prev = PrevNode(0)
        helper(root, prev, res)
        if Solution.maxcount == prev.count:
                res.append(prev.node.val)
        elif prev.count > Solution.maxcount:
                res = [prev.node.val]
        return res
按理来说不是应该list算是object么?应该是传引用的嘛? 可是我debug发现运行完helper函数之后 res还是空的 说明是按值传的?
刚刚开始学python也不是很懂 顺便求一下比较好的教程
回复

使用道具 举报

🔗
haveto 2017-4-7 11:44:51 | 只看该作者
全局:
33847682 发表于 2017-4-7 09:46
就比如这题我这么写
class Solution(object):
    maxcount = 0

python 是pass by reference of object, 既不是值传递也不是引用传递。 stackflow搜一下我记得有个帖子专门讲这个的
回复

使用道具 举报

🔗
stellari 2017-4-7 12:58:29 | 只看该作者
全局:
33847682 发表于 2017-4-7 09:46
就比如这题我这么写
class Solution(object):
    maxcount = 0

你要区分一下“对象”和“引用对象的变量”这两者的区别。比如:
def foo(a):
    a = ["abc"]

b = ["def"]
foo(b)

其中,["def"]和["abc"]都是实实在在的list对象,而a和b都是对象的引用。当b传入foo时,a和b一开始都指向["def"]。但是执行到a=["abc"]时,会新创建一个["abc"],并令a指向之(而b没有受到任何影响,依然指向["def"])。当foo结束时,a和其指向的["abc"]都被销毁;而b和其指向的["def"]没有受到任何改变。

但如果是
def bar(a):
    a.append("abc")
情况就不同了,a.append()会在a指向的对象(也就是b所指向的对象,["def"])末尾增加一个"abc",因此这时的改变就真正地影响到了b所指向的对象。
回复

使用道具 举报

🔗
 楼主| 33847682 2017-4-7 13:14:09 | 只看该作者
全局:
stellari 发表于 2017-4-7 12:58
你要区分一下“对象”和“引用对象的变量”这两者的区别。比如:
def foo(a):
    a = ["abc"]

懂了 太感谢了 还需继续修炼啊
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册账号
隐私提醒:
  • ☑ 禁止发布广告,拉群,贴个人联系方式:找人请去🔗同学同事飞友,拉群请去🔗拉群结伴,广告请去🔗跳蚤市场,和 🔗租房广告|找室友
  • ☑ 论坛内容在发帖 30 分钟内可以编辑,过后则不能删帖。为防止被骚扰甚至人肉,不要公开留微信等联系方式,如有需求请以论坛私信方式发送。
  • ☑ 干货版块可免费使用 🔗超级匿名:面经(美国面经、中国面经、数科面经、PM面经),抖包袱(美国、中国)和录取汇报、定位选校版
  • ☑ 查阅全站 🔗各种匿名方法

本版积分规则

>
快速回复 返回顶部 返回列表