📣 4th of July限时特惠: VIP通行证立减$68
查看: 3188| 回复: 10
跳转到指定楼层
上一主题 下一主题
收起左侧

面试答题的时候,用到instance variable会不会不太好

全局:

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

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

x
使用instance variable会不会显得不够OO
比如 leetcode 98题 validate binary search tree, 我没有找到把 pre 这个变量放到recursive call里的方法,所以用做instance variable 了。

class Solution {
    TreeNode pre;
    public boolean isValidBST(TreeNode root) {
        if (root == null) return true;
        if (!isValidBST(root.left)) return false;
        if (pre != null && pre.val >= root.val) return false;
        pre = root;
        return isValidBST(root.right);
    }
}



补充内容 (2018-7-12 07:50):
应该说是class variable更准确

上一篇:谈谈面试官在面试coding题目时的考察终点与心理活动, 求大米
下一篇:Leetcode Database 185. Department Top Three Salaries
推荐
magicsets 2018-7-13 04:40:56 | 只看该作者
全局:
首先当你使用instance variable时,实际上是有一个隐含的this指针指向当前子过程的运行环境(environment)的 —— 这一访问environment的机制是一种应当提倡使用的便利、高级语言所提供的一种feature,在函数式语言中称为闭包(closure),在OO语言中即为object(data + code的encapsulation)。

如果不想要使用隐式this,那可以将其显示化,也就是自定义一个environment,例如你这个例子可以改写为:
class Solution {
    static class Environment {
      TreeNode pre;
    }

    public boolean isValidBST(TreeNode root) {
      return isValidBST(new Environment(), root);
    }

    private boolean isValidBST(Environment env, TreeNode root) {
        if (root == null) return true;
        if (!isValidBST(root.left)) return false;
        if (env.pre != null && env.pre.val >= root.val) return false;
        env.pre = root;
        return isValidBST(root.right);
    }
}

当然这基本上是多此一举,更好的做法是直接打包一个stateful executor

// Stateful means it is not thread-safe.
// This essentially abstracts a functor with implicit states, or a "closure".
class StatefulBSTValidator {
    private TreeNode pre;

    public boolean isValidBST(TreeNode root) {
        if (root == null) return true;
        if (!isValidBST(root.left)) return false;
        if (pre != null && pre.val >= root.val) return false;
        pre = root;
        return isValidBST(root.right);
    }
}

class Solution {
    // This method is thread-safe.
    public boolean isValidBST(TreeNode root) {
      return new StatefulBSTValidator().isValidBST(root);
    }
}

评分

参与人数 1大米 +3 收起 理由
Self_Learner + 3 给你点个赞!

查看全部评分

回复

使用道具 举报

🔗
pxu 2018-7-12 08:04:39 | 只看该作者
全局:
你这个是instance variable. class variable 一般是static 的,shared by all instance.
回复

使用道具 举报

🔗
 楼主| Self_Learner 2018-7-12 11:09:19 | 只看该作者
全局:
pxu 发表于 2018-7-12 08:04
你这个是instance variable. class variable 一般是static 的,shared by all instance.

嗯 应该加上static的
回复

使用道具 举报

🔗
webelieve7562 2018-7-12 20:47:51 | 只看该作者
全局:
可以自己建个class把pre包在里面,然后这个class就可以写成函数参数了,不过感觉这个无所谓吧
回复

使用道具 举报

🔗
MrAtoZ 2018-7-12 20:59:52 | 只看该作者
全局:
递归的时候用全局变量不太好,iterative应该没关系吧。
回复

使用道具 举报

🔗
 楼主| Self_Learner 2018-7-13 01:26:26 | 只看该作者
全局:
MrAtoZ 发表于 2018-7-12 20:59
递归的时候用全局变量不太好,iterative应该没关系吧。

如果是Iterative,就用不着用全局变量了,定义一个local variable就好了。这个全局变量就是用来在recursive call的时候被update的。
因为之前看Leet code上有人说:Using class member variables to pass values between method calls can be considered bad practice, especially when multithreading.
感觉面试的时候是不是应该最好避免这种写法。。。
回复

使用道具 举报

🔗
 楼主| Self_Learner 2018-7-13 01:27:45 | 只看该作者
全局:
webelieve7562 发表于 2018-7-12 20:47
可以自己建个class把pre包在里面,然后这个class就可以写成函数参数了,不过感觉这个无所谓吧

感谢回复,你的意思是用private class吗?
回复

使用道具 举报

🔗
MrAtoZ 2018-7-13 09:44:13 | 只看该作者
全局:
Self_Learner 发表于 2018-7-13 01:26
如果是Iterative,就用不着用全局变量了,定义一个local variable就好了。这个全局变量就是用来在recursi ...

是要尽力避免,但是感觉有些题还是不得不用。
回复

使用道具 举报

🔗
 楼主| Self_Learner 2018-7-13 12:14:50 | 只看该作者
全局:
magicsets 发表于 2018-7-13 04:40
首先当你使用instance variable时,实际上是有一个隐含的this指针指向当前子过程的运行环境(environment) ...

谢谢这么用心的解释!的确,用全局变量不thread-safe, 用inner class可以解决这个问题,不过是显得verbose。解题时按需求来就好。
回复

使用道具 举报

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

本版积分规则

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