一亩三分地论坛

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

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

谷歌第一轮电面 8月27日

[复制链接] |试试Instant~ |关注本帖
diegowangyz 发表于 2016-8-30 04:29:58 | 显示全部楼层 |阅读模式

2016(7-9月) 码农类 硕士 全职@Google - 内推 - 技术电面 |Otherfresh grad应届毕业生

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

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

x
Problem 1:
给一个array,按顺序输出发生重复的元素。举例:[1, 2, 3, 1, 1, 2, 4],输出1和2。
我的做法是用两个hash set,一个记录是否是重复的元素,一个记录是否这个重复的元素已经加到了输出结果里。

  1. getDup():

  2. ArrayList<Integer> res;
  3. HashSet<Integer> set1, set2;

  4. for (int i = 0; i < A.length; i++) {
  5.         if (!set1.contains(A[i])) {. 鐗涗汉浜戦泦,涓浜╀笁鍒嗗湴
  6.                 set1.add(A[i]);
  7.         } else {
  8.                 if (!set2.contains(A[i])) {
  9.                         res.add(A[i]);
  10.                         set2.add(A[i]);
  11.                 }
  12.         }
  13. }
  14. return res;
复制代码
Problem 2:
给一组国家到其人口的映射(map):country->population,让求一个getCountry() 的函数,使返回的国家名字与其对应人口数成比例,可以使用内置的random函数。
. visit 1point3acres.com for more.
举例:
China -> 1.3 billion
US -> 0.4b billion
Russia -> 0.3b billion

要求call getCountry 返回China的概率是65%,US的概率20%,Russia 的概率15%。

  1. Class Country{
  2.         String name;
  3.         int population;
  4.         int start;
  5.         int end;
  6.         public Country (…) {
  7.                 this.name = name;. from: 1point3acres.com/bbs
  8.                 …
  9.                 //constructor.1point3acres缃
  10.         }
  11. }

  12. int sum;
  13. preprocessing();

  14. HashSet<Country> set;
  15. sum = 0;
  16. for (String country: map.keySet()) {
  17.         int pop =map.get(country);
  18.         Country temp = new Country(name, pop, sum, sum + pop);
  19.         set.add(temp);
  20. }

  21. getCountry():

  22. int val = sum*random.();

  23. for (Country temp: set) {
  24.         if (country.start <= val && val < country.end) {
  25.                 return country.name;
  26.         }
  27. }. 鐣欏鐢宠璁哄潧-涓浜╀笁鍒嗗湴
  28. return null;
复制代码
我给了两个解法。
sol1: 把random函数乘以每一个国家的人口数,loop一遍以后找出最大的那个。这个解法比较浪费资源,用很多的random()。

sol2: 创建一个新的数据结构,预处理产生一个HashSet,储存range的信息。每次call getCountry(),就loop一遍set,找到对应的range。复杂度O(n)。

China: [0, 1.3)
US: [1.3, 1.7)
Russia: [1.7, 2.0]
这道题目可以优化到binary的时间,在preprocessing的时候做一个以start为元素的array。
[0,         1.3,       1.7]
China,   US,       Russia
用binary search找到第一个比2.0*random大的值,返回其之前的一个国家名称,比如,2.0*random = 1.4,getCountry返回US。时间复杂度为log(n)。




补充内容 (2016-8-30 06:57):
第二题的做法里面sum是要更新的哈……不好意思

评分

2

查看全部评分

本帖被以下淘专辑推荐:

zyoppy008 发表于 2016-8-30 04:59:55 | 显示全部楼层
第一题 你代码有问题吧 你这样不是顺序输出吧 比如1 2 3 2 1 第二题 第二种解法 跟hashset 没关系 一般数组就行吧
回复 支持 反对

使用道具 举报

edyyy 发表于 2016-8-30 05:10:45 | 显示全部楼层
楼主你有做OA吗?
回复 支持 反对

使用道具 举报

 楼主| diegowangyz 发表于 2016-8-30 06:02:48 | 显示全部楼层
zyoppy008 发表于 2016-8-30 04:59
第一题 你代码有问题吧 你这样不是顺序输出吧 比如1 2 3 2 1 第二题 第二种解法 跟hashset 没关系 一般数组 ...

第一个应该没错吧,第二个你说的对,用一个array就OK。也是我说的优化binary search做法。
回复 支持 反对

使用道具 举报

 楼主| diegowangyz 发表于 2016-8-30 06:03:04 | 显示全部楼层
edyyy 发表于 2016-8-30 05:10
楼主你有做OA吗?

做了,地里有面筋
回复 支持 反对

使用道具 举报

Tsien 发表于 2016-8-30 06:33:07 | 显示全部楼层
第二题代码里,那个sum好像没有更新,还是我理解错了?
回复 支持 反对

使用道具 举报

 楼主| diegowangyz 发表于 2016-8-30 06:56:08 | 显示全部楼层
Tsien 发表于 2016-8-30 06:33
第二题代码里,那个sum好像没有更新,还是我理解错了?
鏉ユ簮涓浜.涓夊垎鍦拌鍧.
不好意思,确实错了。要更新的sum的
回复 支持 反对

使用道具 举报

fish444555 发表于 2016-8-30 08:44:26 | 显示全部楼层
请问为什么不能全部加起来得到sum,然后用各国人数除以这个sum,是我忽略了什么了吗?  例如测试例子, 1.3 + 0.4 + 0.3 = 2 ,  p(cn) = 1.3 / 2 = 65%, ....  感觉这种想法太简单,不会是gg的题,但是不知道有什么反例,请知道的人告诉一下,谢谢
回复 支持 反对

使用道具 举报

chestnut9919 发表于 2016-8-30 09:31:26 | 显示全部楼层
第二题population不是double吗?为什么你都写int?double的话,怎么生成random?
回复 支持 反对

使用道具 举报

zyoppy008 发表于 2016-8-30 10:45:26 | 显示全部楼层
diegowangyz 发表于 2016-8-30 06:02
第一个应该没错吧,第二个你说的对,用一个array就OK。也是我说的优化binary search做法。
.鐣欏璁哄潧-涓浜-涓夊垎鍦
你看 1 2 3 2 1  你的结果是2 1 难道不应该是 1 2吗
回复 支持 反对

使用道具 举报

 楼主| diegowangyz 发表于 2016-8-31 08:15:40 | 显示全部楼层
fish444555 发表于 2016-8-30 08:44
请问为什么不能全部加起来得到sum,然后用各国人数除以这个sum,是我忽略了什么了吗?  例如测试例子, 1.3 ...
. 1point 3acres 璁哄潧
你需要加一个random seed,要求得到的国家的概率和其人口成正比,题目确实不难。
回复 支持 反对

使用道具 举报

 楼主| diegowangyz 发表于 2016-8-31 08:16:58 | 显示全部楼层
chestnut9919 发表于 2016-8-30 09:31
第二题population不是double吗?为什么你都写int?double的话,怎么生成random?

. 鐣欏鐢宠璁哄潧-涓浜╀笁鍒嗗湴嗯,我写的代码不是很严谨。在面试的时候我问了说可以用int,主要是为了展示big idea吧。
回复 支持 反对

使用道具 举报

 楼主| diegowangyz 发表于 2016-8-31 08:18:26 | 显示全部楼层
zyoppy008 发表于 2016-8-30 10:45
你看 1 2 3 2 1  你的结果是2 1 难道不应该是 1 2吗

2 1,顺序是第一个重复出现的顺序,2 最先出现重复。
回复 支持 反对

使用道具 举报

fish444555 发表于 2016-8-31 08:32:18 | 显示全部楼层
diegowangyz 发表于 2016-8-31 08:15
你需要加一个random seed,要求得到的国家的概率和其人口成正比,题目确实不难。

谢谢解答. From 1point 3acres bbs
字数字数字数
回复 支持 反对

使用道具 举报

zyoppy008 发表于 2016-8-31 11:08:56 | 显示全部楼层
zyoppy008 发表于 2016-8-30 10:45. 鍥磋鎴戜滑@1point 3 acres
你看 1 2 3 2 1  你的结果是2 1 难道不应该是 1 2吗

原来如此,我还以为是按原顺序排序
回复 支持 反对

使用道具 举报

zyoppy008 发表于 2016-8-31 11:24:14 | 显示全部楼层
diegowangyz 发表于 2016-8-31 08:18
2 1,顺序是第一个重复出现的顺序,2 最先出现重复。

但是就算那样,也可以只用一个map就可以解决吧,等于2的时候放进来
回复 支持 反对

使用道具 举报

elixuy 发表于 2016-8-31 21:36:58 | 显示全部楼层
谢谢楼主分享,请问电面之后大概多久有消息
回复 支持 反对

使用道具 举报

 楼主| diegowangyz 发表于 2016-9-4 07:21:03 | 显示全部楼层
elixuy 发表于 2016-8-31 21:36-google 1point3acres
谢谢楼主分享,请问电面之后大概多久有消息

到现在还没有消息
回复 支持 反对

使用道具 举报

 楼主| diegowangyz 发表于 2016-9-4 07:21:18 | 显示全部楼层
zyoppy008 发表于 2016-8-31 11:24. visit 1point3acres.com for more.
但是就算那样,也可以只用一个map就可以解决吧,等于2的时候放进来

对的,我做的时候比较紧张,就写重复了
回复 支持 反对

使用道具 举报

本版积分规则

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

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

关闭

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

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

custom counter

GMT+8, 2016-12-7 01:03

Powered by Discuz! X3

© 2001-2013 Comsenz Inc. Design By HUXTeam

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