Mock interview for data science
仅限两天:购买DS501或者DS601,全站课程15% off

一亩三分地论坛

 找回密码
 Sign Up 注册获取更多干货
有你有策略
微策略(MicroStrategy)
2019校园招聘火热进行中
E轮2.5亿美元融资
K12教育独角兽一起作业诚聘
机器学习/数据统计/教育等职位
码农求职神器Triplebyte:
不用海投
内推多家公司面试
高效直聘+内推,70%面试率
AI帮你免费完善简历
直击全美十万个科技职位
坐标湾区
DreamCraft创始团队
招聘游戏开发工程师
游戏初创公司招聘工程师、UIUX Designer和游戏策划
把贵司招聘信息放这里
查看: 602|回复: 10
收起左侧

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

[复制链接] |试试Instant~
我的人缘0
Self_Learner 发表于 2018-7-12 07:41:00 | 显示全部楼层 |阅读模式
本楼: 【顶】   0% (0)
 
 
0% (0)   【踩】
全局: 顶  96% (77)
 
 
3% (3)  踩

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

您需要 登录 才可以下载或查看,没有帐号?Sign Up 注册获取更多干货

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
我的人缘0
magicsets 发表于 2018-7-13 04:40:56 | 显示全部楼层
本楼: 【顶】   100% (1)
 
 
0% (0)   【踩】
全局: 顶  98% (342)
 
 
1% (6)  踩
首先当你使用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 给你点个赞!

查看全部评分

回复

使用道具 举报

全球28万学生4.7分推荐
我的人缘3
pxu 发表于 2018-7-12 08:04:39 | 显示全部楼层
本楼: 【顶】   0% (0)
 
 
0% (0)   【踩】
全局: 顶  64% (330)
 
 
35% (183)  踩
你这个是instance variable. class variable 一般是static 的,shared by all instance.
回复

使用道具 举报

我的人缘0
 楼主| Self_Learner 发表于 2018-7-12 11:09:19 | 显示全部楼层
本楼: 【顶】   0% (0)
 
 
0% (0)   【踩】
全局: 顶  96% (77)
 
 
3% (3)  踩
pxu 发表于 2018-7-12 08:04
你这个是instance variable. class variable 一般是static 的,shared by all instance.

嗯 应该加上static的
回复

使用道具 举报

我的人缘0
webelieve7562 发表于 2018-7-12 20:47:51 | 显示全部楼层
本楼: 【顶】   0% (0)
 
 
0% (0)   【踩】
全局: 顶  83% (5)
 
 
16% (1)  踩
可以自己建个class把pre包在里面,然后这个class就可以写成函数参数了,不过感觉这个无所谓吧
回复

使用道具 举报

我的人缘0
MrAtoZ 发表于 2018-7-12 20:59:52 | 显示全部楼层
本楼: 【顶】   0% (0)
 
 
0% (0)   【踩】
全局: 顶  97% (40)
 
 
2% (1)  踩
递归的时候用全局变量不太好,iterative应该没关系吧。
回复

使用道具 举报

我的人缘0
 楼主| Self_Learner 发表于 2018-7-13 01:26:26 | 显示全部楼层
本楼: 【顶】   0% (0)
 
 
0% (0)   【踩】
全局: 顶  96% (77)
 
 
3% (3)  踩
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.
感觉面试的时候是不是应该最好避免这种写法。。。
回复

使用道具 举报

我的人缘0
 楼主| Self_Learner 发表于 2018-7-13 01:27:45 | 显示全部楼层
本楼: 【顶】   0% (0)
 
 
0% (0)   【踩】
全局: 顶  96% (77)
 
 
3% (3)  踩
webelieve7562 发表于 2018-7-12 20:47
可以自己建个class把pre包在里面,然后这个class就可以写成函数参数了,不过感觉这个无所谓吧

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

使用道具 举报

我的人缘0
MrAtoZ 发表于 2018-7-13 09:44:13 | 显示全部楼层
本楼: 【顶】   0% (0)
 
 
0% (0)   【踩】
全局: 顶  97% (40)
 
 
2% (1)  踩
Self_Learner 发表于 2018-7-13 01:26
如果是Iterative,就用不着用全局变量了,定义一个local variable就好了。这个全局变量就是用来在recursi ...

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

使用道具 举报

我的人缘0
 楼主| Self_Learner 发表于 2018-7-13 12:14:50 | 显示全部楼层
本楼: 【顶】   0% (0)
 
 
0% (0)   【踩】
全局: 顶  96% (77)
 
 
3% (3)  踩
magicsets 发表于 2018-7-13 04:40
首先当你使用instance variable时,实际上是有一个隐含的this指针指向当前子过程的运行环境(environment) ...

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

使用道具 举报

游客
请先登录

本版积分规则

提醒:发帖可以选择内容隐藏,部分板块支持匿名发帖。请认真读完以下全部说明:

■隐藏内容方法 - 不要多加空格: [hide=200]你想要隐藏的内容比如面经[/hide]
■意思是:用户积分低于200则看不到被隐藏的内容
■可以自行设置积分值,不建议太高(200以上太多人看不到),也不建议太低(那就没必要隐藏了)
■建议只隐藏关键内容,比如具体的面试题目、涉及隐私的信息,大部分内容没必要隐藏。
■微信/QQ/电子邮件等,为防止将来被骚扰甚至人肉,以论坛私信方式发给对方最安全。
■匿名发帖的板块和方法:http://www.1point3acres.com/bbs/thread-405991-1-1.html

手机版|小黑屋|联系我们&一亩三分地论坛声明

GMT+8, 2018-11-19 13:42

Powered by Discuz! X3

© 2001-2013 Comsenz Inc. Design By HUXTeam

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