一亩三分地论坛

 找回密码
 获取更多干货,去instant注册!

扫码关注一亩三分地公众号
查看: 2333|回复: 24
收起左侧

Google 面经 直接上题

[复制链接] |试试Instant~ |关注本帖
009hsq 发表于 2016-5-22 09:34:30 | 显示全部楼层 |阅读模式

2016(4-6月) 码农类 硕士 全职@Google - 网上海投 - 技术电面 |Failfresh grad应届毕业生

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

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

x
1.   Create a method toreturn a unique collection of <count> random Integers between 0 and <maxValue>(exclusive of maxValue).
2.Create a filterediterator that skips over nulls. Create a class that implements iterator, takesanother iterator in its constructor.  Your class iterates through theother iterator except for cases where the initial iterator has a null value. In this case your iterator skips over the null and treats it as if it didnot exist.
example:
sourceIterator= ‘a’, null, ‘b’
sourceIterator.hasNext()= true
sourceIterator.next()= ‘a’
sourceIterator.hasNext()= true
sourceIterator.next()= null
sourceIterator.hasNext()= true
sourceIterator.next()= ‘b’
sourceIterator.hasNext()= false
yourIterator= new yourIterator(sourceIterator)
yourIterator.hasNext()= true
yourIterator.next()= ‘a’
yourIterator.hasNext()= true
yourIterator.next()= ‘b’

yourIterator.hasNext()= false

评分

1

查看全部评分

yueliu2366 发表于 2016-5-22 10:30:27 | 显示全部楼层
感谢楼主分享。第一题不太理解题意,能否举个例子说明一下呢?. visit 1point3acres.com for more.
第二题自己练习一下:
class yourIterator implements Iterator<E> {
        Iterator<E> it;
        E nextElem;
        public yourIterator(Iterator<E> sourceIterator) {
            this.it = sourceIterator;
            this.nextElem = null;. 鐣欏鐢宠璁哄潧-涓浜╀笁鍒嗗湴
        }
. visit 1point3acres.com for more.
        @Override
        public Integer next() {
            return nextElem;
        }

        @Override
        public boolean hasNext() {
            while(it.hasNext()) {
                nextElem = it.next();
                if (nextElem != null) {
                    return true;.鏈枃鍘熷垱鑷1point3acres璁哄潧
                }
            }
            return false;
        }-google 1point3acres
}
回复 支持 反对

使用道具 举报

nevets 发表于 2016-5-22 10:50:10 | 显示全部楼层
第一题的意思是高效生成0-n中不重复的随机数。由于随机数是随机的,所以到了后期很有可能会产生重复的随机数。最简单的是用一个hashmap来判重,每生成一个元素放hashmap里,如果hashmap里有这个元素就重新生成。这样非常没有效率,因为如果n比较大,后期很可能直接循环到死都出不来。有一个比较好的办法是用knuth shuffle (aka Fisher–Yates shuffle),这样也能保证等概率。
回复 支持 反对

使用道具 举报

wtcupup 发表于 2016-5-22 11:00:44 | 显示全部楼层
yueliu2366 发表于 2016-5-22 10:30
感谢楼主分享。第一题不太理解题意,能否举个例子说明一下呢?
第二题自己练习一下:
class yourIterator ...

你这个代码有个问题啊 第一次youiterator call next 应该return a,但是你return了null
回复 支持 反对

使用道具 举报

yueliu2366 发表于 2016-5-22 11:38:32 | 显示全部楼层
wtcupup 发表于 2016-5-22 11:00
你这个代码有个问题啊 第一次youiterator call next 应该return a,但是你return了null

我代码第一次call会返回a啊,过程是这样的:
yourIterator= new yourIterator(sourceIterator). 鐣欏鐢宠璁哄潧-涓浜╀笁鍒嗗湴
yourIterator.hasNext()= true
yourIterator.next()= ‘a’

为什么你认为会返回null呢?还是我没理解你的意思?
回复 支持 反对

使用道具 举报

wtcupup 发表于 2016-5-22 11:47:13 | 显示全部楼层
yueliu2366 发表于 2016-5-22 11:38. Waral 鍗氬鏈夋洿澶氭枃绔,
我代码第一次call会返回a啊,过程是这样的:
yourIterator= new yourIterator(sourceIterator)
yourIte ...
. from: 1point3acres.com/bbs
是不是可以直接
yourIterator= new yourIterator(sourceIterator) . more info on 1point3acres.com
yourIterator.next()= ‘a’

不用在之间hasNext呢?
回复 支持 反对

使用道具 举报

yueliu2366 发表于 2016-5-22 12:11:07 | 显示全部楼层
wtcupup 发表于 2016-5-22 11:47
是不是可以直接
yourIterator= new yourIterator(sourceIterator)
yourIterator.next()= ‘a’
.鏈枃鍘熷垱鑷1point3acres璁哄潧
我的看法是不能这样吧,要调用yourIterator.next()之前不是都需要先调用yourIterator.hasNext()吗? lc里面都是这样的,不清楚这题是怎么样的考法。
回复 支持 反对

使用道具 举报

ccrjohn8787 发表于 2016-5-22 21:25:24 | 显示全部楼层
yueliu2366 发表于 2016-5-22 10:30
感谢楼主分享。第一题不太理解题意,能否举个例子说明一下呢?.1point3acres缃
第二题自己练习一下:
class yourIterator ...

如果多次调用hasNext() before call next(), 会出问题,好多sourceIterator 的数字会被skip
回复 支持 反对

使用道具 举报

Altynai 发表于 2016-5-22 21:26:06 | 显示全部楼层
第一题是不是就是pseudo-random number generators问题

可以参考:http://preshing.com/20121224/how-to-generate-a-sequence-of-unique-random-integers/
回复 支持 反对

使用道具 举报

ccrjohn8787 发表于 2016-5-22 21:26:46 | 显示全部楼层
yueliu2366 发表于 2016-5-22 10:30
感谢楼主分享。第一题不太理解题意,能否举个例子说明一下呢?
第二题自己练习一下:
class yourIterator ...

加一个boolean flag来表示hasNext()之后next() 有没有被调用就行
回复 支持 反对

使用道具 举报

 楼主| 009hsq 发表于 2016-5-22 21:37:51 | 显示全部楼层
第一题能直接用java 里的random method
回复 支持 反对

使用道具 举报

yueliu2366 发表于 2016-5-22 21:47:31 | 显示全部楼层
ccrjohn8787 发表于 2016-5-22 21:26.鏈枃鍘熷垱鑷1point3acres璁哄潧
加一个boolean flag来表示hasNext()之后next() 有没有被调用就行
. 1point3acres.com/bbs
你说的没错,多谢指正! 还有种方法就是修改下hasNext也可以,在刚开始的时候判断下nextElem是不是为null
@Override
        public boolean hasNext() { 鏉ユ簮涓浜.涓夊垎鍦拌鍧.

            while(it.hasNext()) {
                nextElem = it.next();
                if (nextElem != null) {
                    return true;. from: 1point3acres.com/bbs
                }
            }
            return false;
        }
回复 支持 反对

使用道具 举报

yueliu2366 发表于 2016-5-22 21:50:10 | 显示全部楼层
yueliu2366 发表于 2016-5-22 21:47
你说的没错,多谢指正! 还有种方法就是修改下hasNext也可以,在刚开始的时候判断下nextElem是不是为null ...
-google 1point3acres
不小心按了发送了。。没打完
@Override
        public boolean hasNext() {.鐣欏璁哄潧-涓浜-涓夊垎鍦
            if (nextElem != null) {
              return true;
            }. 鐣欏鐢宠璁哄潧-涓浜╀笁鍒嗗湴
            while(it.hasNext()) {
                nextElem = it.next();-google 1point3acres
                if (nextElem != null) {
                    return true;. 1point 3acres 璁哄潧
                }
            }
            return false;
        }
顺便问下,在调用next前可以多次调用hasNext,但是在调用next前,肯定是保证hasNext至少被调用过一次的吧?我的意思是,test case不需要考虑直接调用next而没有在之前调用hasNext的情况吧?
回复 支持 反对

使用道具 举报

ccrjohn8787 发表于 2016-5-22 22:45:48 | 显示全部楼层
yueliu2366 发表于 2016-5-22 21:50
不小心按了发送了。。没打完. 鐗涗汉浜戦泦,涓浜╀笁鍒嗗湴
@Override
        public boolean hasNext() {

对,要不然就break contract 了
回复 支持 反对

使用道具 举报

xiaoyujiang 发表于 2016-5-24 00:44:26 | 显示全部楼层
yueliu2366 发表于 2016-5-22 21:50. 1point3acres.com/bbs
不小心按了发送了。。没打完-google 1point3acres
@Override
        public boolean hasNext() {

可以解释一下为什么一开始的代码有问题么?
回复 支持 反对

使用道具 举报

xiaoyujiang 发表于 2016-5-24 01:00:36 | 显示全部楼层
yueliu2366 发表于 2016-5-22 21:50
不小心按了发送了。。没打完
@Override
        public boolean hasNext() {

意思是只要不call next()一直call hasNex()的话就一直返回true?
回复 支持 反对

使用道具 举报

yueliu2366 发表于 2016-5-24 01:00:50 | 显示全部楼层
xiaoyujiang 发表于 2016-5-24 00:44
可以解释一下为什么一开始的代码有问题么?

如果按照正常顺序,先调用一次hasNext(),在调用一次next(),如此循环直到结束。这样是没问题的。但是如果有人先调用hasNext()多次,再调用next(),就会出错。举个例子,假如本来的list是{a, b, c}, 然后有人调用了两次hasNext(), 接着调用next(),这时候会返回b,而实际上时候应该返回的是a才对,不能因为调用了hasNext,就影响了结果。修改后的代码应该是:
class yourIterator implements Iterator<E> {
        Iterator<E> it;
        E nextElem;
        public yourIterator(Iterator<E> sourceIterator) {
            this.it = sourceIterator;
            this.nextElem = null;. more info on 1point3acres.com
        } 鏉ユ簮涓浜.涓夊垎鍦拌鍧.

        @Override. 鍥磋鎴戜滑@1point 3 acres
        public Integer next() {
-google 1point3acres            E temp = nextElem;
            nextElem = null
鏉ユ簮涓浜.涓夊垎鍦拌鍧.
            return E;
        }
. 鐣欏鐢宠璁哄潧-涓浜╀笁鍒嗗湴
        @Override
        public boolean hasNext() {
          if (nextElem != null) {
             return true;
           }

            while(it.hasNext()) {
                nextElem = it.next();
                if (nextElem != null) {.鏈枃鍘熷垱鑷1point3acres璁哄潧
                    return true;
                }
            }
            return false;
        }
}
回复 支持 反对

使用道具 举报

yueliu2366 发表于 2016-5-24 01:09:20 | 显示全部楼层
xiaoyujiang 发表于 2016-5-24 01:00
意思是只要不call next()一直call hasNex()的话就一直返回true?

不是,原来代码是这样:
public boolean hasNext() {
            while(it.hasNext()) {
                nextElem = it.next();
                if (nextElem != null) {
                    return true;
                }
            }
            return false;
        }
. 1point 3acres 璁哄潧
假如list是{a,b,c}。 那么正常调用顺序是:
if(hasNext()) print(next())---------输出a
if(hasNext()) print(next())---------输出b
if(hasNext()) print(next())---------输出c. 鍥磋鎴戜滑@1point 3 acres

现在假如不这么调用了,变成:. from: 1point3acres.com/bbs
if(hasNext())---------没有输出,但是此时nextElem = a
if(hasNext()) print(next())---------这次调用hasNext会先执行nextElem = b,然后输出b,这样就不对了啊,应该输出a才对,因为a还没输出就被跳过了
回复 支持 反对

使用道具 举报

xiaoyujiang 发表于 2016-5-24 01:28:21 | 显示全部楼层
yueliu2366 发表于 2016-5-24 01:00.鐣欏璁哄潧-涓浜-涓夊垎鍦
如果按照正常顺序,先调用一次hasNext(),在调用一次next(),如此循环直到结束。这样是没问题的。但是如果 ...

谢谢回复!但是我怎么觉得这样implement hasNext的话结果会错。比如list是{a,null,null},第一次调用hasNext之后nextElem被赋成a,再第二次调用hasNext的时候因为nextElem!=null,return值是true,但是因为a之后全是null,return值应该为false才对
回复 支持 反对

使用道具 举报

lusong 发表于 2016-5-24 01:29:41 | 显示全部楼层
IMHO, cache the next one in the constructor and next() to make hasNext() simpler.

  1.    class YourIterator <E> implements Iterator<E> {
  2.         private final Iterator<E> it;
  3.         E nextElem;
  4.         public YourIterator(Iterator<E> sourceIterator) {
  5.             this.it = sourceIterator;
  6.             getNext();. Waral 鍗氬鏈夋洿澶氭枃绔,
  7.         }

  8.         private void getNext(){
  9. . visit 1point3acres.com for more.
  10.             nextElem=null;
  11.             while (it.hasNext()){
  12.                 nextElem=it.next();. from: 1point3acres.com/bbs
  13.                 if (nextElem!=null){
  14.                     break;
  15.                 }
  16.             }

  17.         }

  18.         @Override
  19.         public E next() {
  20.             E toBeReturn = nextElem;
  21.             getNext();
  22.             return toBeReturn;
  23.         }

  24.         @Override. 1point3acres.com/bbs
  25.         public boolean hasNext() {
  26.             return nextElem!=null;
  27.         }.1point3acres缃
  28.     }
复制代码
回复 支持 反对

使用道具 举报

本版积分规则

请点这里访问我们的新网站:一亩三分地Instant.

Instant搜索更强大,不扣积分,内容组织的更好更整洁!目前仍在beta版本,努力完善中!反馈请点这里

关闭

一亩三分地推荐上一条 /5 下一条

手机版|小黑屋|一亩三分地论坛声明 ( 沪ICP备11015994号 )

custom counter

GMT+8, 2016-12-5 06:51

Powered by Discuz! X3

© 2001-2013 Comsenz Inc. Design By HUXTeam

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