一亩三分地论坛

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

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

[编程题] 求问一道Amazon的面经题

[复制链接] |试试Instant~ |关注本帖
雨做的云 发表于 2015-3-10 04:05:57 | 显示全部楼层 |阅读模式

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

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

x
1.
input a random number from 1-100. Output a random number from 1-30;



swotong 发表于 2015-3-10 05:15:09 | 显示全部楼层
跪了,我连题都看不懂。。
回复 支持 反对

使用道具 举报

EchoO 发表于 2015-3-10 05:33:31 | 显示全部楼层
swotong 发表于 2015-3-10 05:15
跪了,我连题都看不懂。。

你不是一个人 ONL
回复 支持 反对

使用道具 举报

swotong 发表于 2015-3-10 05:37:47 | 显示全部楼层
EchoO 发表于 2015-3-10 05:33
你不是一个人 ONL

onl啥意思?
回复 支持 反对

使用道具 举报

EchoO 发表于 2015-3-10 05:39:01 | 显示全部楼层

看着不像一个人跪下来了么
哈哈
回复 支持 反对

使用道具 举报

swotong 发表于 2015-3-10 05:42:14 | 显示全部楼层
EchoO 发表于 2015-3-10 05:39
看着不像一个人跪下来了么
哈哈

惭愧,之前只认识ORZ......
回复 支持 反对

使用道具 举报

漫漫琳游的鱼 发表于 2015-3-10 06:09:10 | 显示全部楼层
。。。output都没有限制条件吗,随机的?
回复 支持 反对

使用道具 举报

 楼主| 雨做的云 发表于 2015-3-10 06:50:40 | 显示全部楼层
漫漫琳游的鱼 发表于 2015-3-10 06:09
。。。output都没有限制条件吗,随机的?

对啊,随机的,java里面有随机数
回复 支持 反对

使用道具 举报

readman 发表于 2015-3-10 10:27:31 | 显示全部楼层
这题看你怎么看了, 你可以直接mod 30 看看面试官让不让你过
回复 支持 反对

使用道具 举报

真爱你的云 发表于 2015-3-10 10:36:44 | 显示全部楼层
input 跟 output 有联系么??
回复 支持 反对

使用道具 举报

shawlin 发表于 2015-3-10 10:38:41 | 显示全部楼层
我觉得每次call random(100), 产生的数1到100, 如果大于90我们就不要,因为不能保证equal probability
然后再mod 30
回复 支持 反对

使用道具 举报

stellari 发表于 2015-3-10 17:14:51 | 显示全部楼层
这题你得至少先问清:

1, 输入和输出的数字各满足什么分布。
2,数字是浮点型还是整数。
3,是否能够调用任何的随机数产生函数。

如果规定是这样:“输入输出都必须是满足均匀分布的指定范围内的整数,不允许调用任何随机数产生函数,输入只有一个数且只输入一次。” 就等于要做到把一个1-100范围内的整数均匀映射为一个1-30范围内的整数,这点似乎不太容易做到。但是如果其中某条要求不严格,我们就可能可以用下面的某个解法:

1. mod(30)+1可以产生出正确的范围,但是显然1~11之间数字的概率会大些;
2. 多次调用random1to100()能够产生出正确的输出,但是使用了random1to100()这个随机数产生器;
3. (rand - 1) / 99 * 29 + 1仅可以在输出输入都是浮点数的情况下得到正确答案。

所以,楼主你还有没有其他的信息?
回复 支持 反对

使用道具 举报

ryancooper 发表于 2015-3-11 10:40:51 | 显示全部楼层
这题没有这么麻烦吧,直接用rand100生成一个数,如果这个数是在1到30的,我们就保留;如果是大于30的,我们就再执行rand100直到我们获得的数在1到30之间。这样产生的概率是:
1/100 + (70/100)*(1/100) + ((70/100)^2)*(1/100) + ((70/100)^3)*(1/100) + ..... = (1/100) * (1/(1-70/100)) = 1/30
回复 支持 反对

使用道具 举报

lijie 发表于 2015-3-11 15:28:22 | 显示全部楼层
本帖最后由 lijie 于 2015-3-11 16:24 编辑

我觉得题意是每调用一次随机数函数就要生成一个1到三十之间的随机数,不过3不是100的因子,可能没法实现。上面各位说的方法可以做些改进,比如把1到100的随机数先减1然后舍弃0。
回复 支持 反对

使用道具 举报

ephemeron 发表于 2015-3-11 19:52:16 | 显示全部楼层
输入不等于100的时候output = input / 3 + 1
输入等于100的时候输出1-30随机数?
回复 支持 反对

使用道具 举报

jintiandeng 发表于 2015-3-11 20:52:13 | 显示全部楼层
while(true){
        int x=random.nextInt(100)+1;
        if(x>=1 && x<=90){
               return x%30==0? 30:x%30;
        }
}
回复 支持 反对

使用道具 举报

lajiwushi 发表于 2015-3-11 21:42:18 | 显示全部楼层
int b = (int)(random.nextInt(100)*30.0/100+1);
回复 支持 反对

使用道具 举报

lajiwushi 发表于 2015-3-11 21:46:52 | 显示全部楼层
lajiwushi 发表于 2015-3-11 21:42
int b = (int)(random.nextInt(100)*30.0/100+1);

错了.......
回复 支持 反对

使用道具 举报

kateheart 发表于 2015-3-19 07:29:47 | 显示全部楼层
本帖最后由 kateheart 于 2015-3-19 07:30 编辑

貌似写一个最简单hash,
30是个特别的数字, 因为1-30是31个数字,而这个数字是素数, 32又是2的5次方。
每次来个数mod 31就好了吧。

Note:
一定要mod 素数,因为这样不会conflict.
回复 支持 反对

使用道具 举报

purlin07 发表于 2015-4-1 03:07:16 | 显示全部楼层
http://www.raychase.net/2861
LZ可以看看这篇博客
回复 支持 反对

使用道具 举报

本版积分规则

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

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

关闭

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

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

custom counter

GMT+8, 2016-12-10 19:04

Powered by Discuz! X3

© 2001-2013 Comsenz Inc. Design By HUXTeam

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