详谈如何最大化利用career fair

一亩三分地论坛

 找回密码
 Sign Up 注册获取更多干货

最近看过此主题的会员

坐标湾区
DreamCraft创始团队
招聘游戏开发工程师
游戏初创公司招聘工程师、UIUX Designer和游戏策划
码农求职神器Triplebyte:
不用海投
内推多家公司面试
前Google华人高管创立
面试offer一键直通
Leap.ai助你进入热门独角兽
查看: 451|回复: 10
收起左侧

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

[复制链接] |试试Instant~
我的人缘0
Self_Learner 发表于 2018-7-12 07:41:00 | 显示全部楼层 |阅读模式
本楼: 【顶】   0% (0)
 
 
0% (0)   【踩】
全局: 顶  90% (28)
 
 
9% (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)   【踩】
全局: 顶  97% (254)
 
 
2% (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)   【踩】
全局: 顶  67% (306)
 
 
32% (148)  踩
你这个是instance variable. class variable 一般是static 的,shared by all instance.
回复

使用道具 举报

我的人缘0
 楼主| Self_Learner 发表于 2018-7-12 11:09:19 | 显示全部楼层
本楼: 【顶】   0% (0)
 
 
0% (0)   【踩】
全局: 顶  90% (28)
 
 
9% (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就可以写成函数参数了,不过感觉这个无所谓吧

21.000+ students read the Road to learn React. The course weaves all the opinionated roadmaps into one roadmap to master React. It gives you all the fundamentals in React. You will build a Hacker News App along the way.

回复

使用道具 举报

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

使用道具 举报

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

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

With React+D3v4 you'll learn the basics of building fast data visualization components in about an hour.

回复

使用道具 举报

我的人缘0
MrAtoZ 发表于 2018-7-13 09:44:13 | 显示全部楼层
本楼: 【顶】   0% (0)
 
 
0% (0)   【踩】
全局: 顶  97% (36)
 
 
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)   【踩】
全局: 顶  90% (28)
 
 
9% (3)  踩
magicsets 发表于 2018-7-13 04:40
首先当你使用instance variable时,实际上是有一个隐含的this指针指向当前子过程的运行环境(environment) ...

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

使用道具 举报

我的人缘0
 楼主| Self_Learner 发表于 2018-7-13 13:03:02 | 显示全部楼层
本楼: 【顶】   0% (0)
 
 
0% (0)   【踩】
全局: 顶  90% (28)
 
 
9% (3)  踩
MrAtoZ 发表于 2018-7-13 09:44
是要尽力避免,但是感觉有些题还是不得不用。

嗯,如果面试官提出需要thread safe, 就用inner class好了

Learn React.js, Redux & Immutable.js while building a weather app

回复

使用道具 举报

游客
请先登录

本版积分规则

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

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

手机版|小黑屋|一亩三分地论坛声明

GMT+8, 2018-9-25 11:43

Powered by Discuz! X3

© 2001-2013 Comsenz Inc. Design By HUXTeam

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