Redian新闻
>
版主应该置顶~~~受不了了额
avatar
版主应该置顶~~~受不了了额# PhotoGear - 摄影器材
f*a
1
写一个random函数,产生0 ~ n-1的数,但是有一个black list,产生的数不能在black
list里。 bl是sorted的。
int myRandom(int n, vector bl)
{
    //.....
}.
时间复杂度log(n)
这里是解
http://www.geeksforgeeks.org/forums/topic/generate-a-random-num
但问题是建立mapping的时候怎么样才能log(n)二分查找 找到下个不在bl里面的数?
follow up是设计一个分布式系统,可以往这个系统里面call一个function叫
getRandom(),每次call返回一个随机数,不能有重复。follow up不用考虑bl.
avatar
G*r
2
隔三差五就蹦出来一个问什么器材适合拍娃
到底是什么啊?~~~~
不如版主给出一个终结版,然后置顶吧~~~
三伏天烤火炉披棉被跪柏油马路吃辣椒火锅哭求版主同意~~~~
avatar
j*4
3
空间复杂度有要求吗?

【在 f********a 的大作中提到】
: 写一个random函数,产生0 ~ n-1的数,但是有一个black list,产生的数不能在black
: list里。 bl是sorted的。
: int myRandom(int n, vector bl)
: {
:     //.....
: }.
: 时间复杂度log(n)
: 这里是解
: http://www.geeksforgeeks.org/forums/topic/generate-a-random-num
: 但问题是建立mapping的时候怎么样才能log(n)二分查找 找到下个不在bl里面的数?

avatar
G*Y
4
问题是答案不唯一
也不固定

【在 G**********r 的大作中提到】
: 隔三差五就蹦出来一个问什么器材适合拍娃
: 到底是什么啊?~~~~
: 不如版主给出一个终结版,然后置顶吧~~~
: 三伏天烤火炉披棉被跪柏油马路吃辣椒火锅哭求版主同意~~~~

avatar
w*x
5
不应该用map,直接产生随机数,然后在black list里走。这时可用二叉树了。

【在 f********a 的大作中提到】
: 写一个random函数,产生0 ~ n-1的数,但是有一个black list,产生的数不能在black
: list里。 bl是sorted的。
: int myRandom(int n, vector bl)
: {
:     //.....
: }.
: 时间复杂度log(n)
: 这里是解
: http://www.geeksforgeeks.org/forums/topic/generate-a-random-num
: 但问题是建立mapping的时候怎么样才能log(n)二分查找 找到下个不在bl里面的数?

avatar
l*a
6
版主“应该”置顶的太多了,还是有问题的自己慢慢考古吧

【在 G**********r 的大作中提到】
: 隔三差五就蹦出来一个问什么器材适合拍娃
: 到底是什么啊?~~~~
: 不如版主给出一个终结版,然后置顶吧~~~
: 三伏天烤火炉披棉被跪柏油马路吃辣椒火锅哭求版主同意~~~~

avatar
Q*3
7
假设blacklist里有k个数
1.产生 一个[0,n - k) 的随机数:r=random(0,n - k)
问题就变成了,如何在whitelist里找到对应r这个位置的数,使用binary search
2.find the greatest index a bl[a]<=r
if res = r + a - 1 not in blacklist, return res
else
while( res == bl[a]){
res++;
a++;
}
if res not in blacklist, return res;
有时间写个程序验证一下
avatar
r*n
8
要是这么容易早就有了。
avatar
Q*3
9
以下程序有bug
int r = myRandom(100,bl);的时候,得到error>0
public class BlacklistRandom {
public static void main(String[] args) {
List bl = new ArrayList();
bl.add(2);
bl.add(4);
bl.add(6);
bl.add(9);
int error = 0;
for(int i=0;i<10000;i++){
int r = myRandom(10,bl);
if(r == 2 ||r == 4 || r == 6 || r == 9){
System.out.println(r);
error ++;
}
}
System.out.println("error count:"+error);
}
private static int myRandom(int n, List bl)
{
int r = new Random().nextInt(n - bl.size() + 1);
int middle = bl.size()/2;
int c = 0;
if(bl.get(middle) == r){
c = middle;
}else if(bl.get(middle) > r){
c = find(r,bl,0,middle);
}else{
c = find(r,bl,middle,bl.size() - 1);
}
if(c>0)
r = r + c - 1;
while(r == bl.get(c)){
r++;
c++;
}
return r;
}
private static int find(int r,List bl,int start,int end){
if(start ==end){
return start;
}else if(end == start +1){
if(r < bl.get(end))
return start;
else return end;
}
int middle = (start + end) /2;
int c = 0;
if(bl.get(middle) == r){
c = middle + 1;
}else if(bl.get(middle) > r){
c = find(r,bl,start,middle);
}else{
c = find(r,bl,middle,end);
}
return c;
}
}
avatar
G*r
10
可以给出3个经典选择,然后置顶
各取所需
快刀斩乱麻
就不要多问了

【在 G**Y 的大作中提到】
: 问题是答案不唯一
: 也不固定

avatar
c*1
11
black list不知道是不是sort的,如果是直接产生后再list中binary search即可。
follow up可能是找到list中的所有interval,然后分布在不同机器上。
avatar
c*y
12
精华区有,去翻翻吧
avatar
n*n
13
看不懂你的题目

【在 f********a 的大作中提到】
: 写一个random函数,产生0 ~ n-1的数,但是有一个black list,产生的数不能在black
: list里。 bl是sorted的。
: int myRandom(int n, vector bl)
: {
:     //.....
: }.
: 时间复杂度log(n)
: 这里是解
: http://www.geeksforgeeks.org/forums/topic/generate-a-random-num
: 但问题是建立mapping的时候怎么样才能log(n)二分查找 找到下个不在bl里面的数?

avatar
G*r
14
难道很难吗??
我不信邪啊~~

【在 r*********n 的大作中提到】
: 要是这么容易早就有了。
avatar
f*a
15
bl是sorted的。但是产生n-len(bl)-1的random number后怎么样binary search去除掉
bl里面的数,而得到正确地?

【在 c******1 的大作中提到】
: black list不知道是不是sort的,如果是直接产生后再list中binary search即可。
: follow up可能是找到list中的所有interval,然后分布在不同机器上。

avatar
G*r
16
有娃的老娘们是不会去精华区的
最方便的就是上来挖坑,然后很多人就沦陷了
我现在看到都要呕吐了~
哭求~~~

【在 c********y 的大作中提到】
: 精华区有,去翻翻吧
avatar
f*a
17
面试官没提。

【在 j*****4 的大作中提到】
: 空间复杂度有要求吗?
avatar
c*y
18
我个人不喜欢放很多东西在置顶的,
不知道其它版务怎么认为。

【在 G**********r 的大作中提到】
: 有娃的老娘们是不会去精华区的
: 最方便的就是上来挖坑,然后很多人就沦陷了
: 我现在看到都要呕吐了~
: 哭求~~~

avatar
f*a
19
怎么用二叉树的?

【在 w****x 的大作中提到】
: 不应该用map,直接产生随机数,然后在black list里走。这时可用二叉树了。
avatar
x5
20
没用,不看的送眼镜底下还是不会看

【在 c********y 的大作中提到】
: 我个人不喜欢放很多东西在置顶的,
: 不知道其它版务怎么认为。

avatar
f*a
21
看不太懂,因为indent不太清楚,大概跑了一下5-->7的例子,r==5不能得到res==7.

【在 Q********3 的大作中提到】
: 假设blacklist里有k个数
: 1.产生 一个[0,n - k) 的随机数:r=random(0,n - k)
: 问题就变成了,如何在whitelist里找到对应r这个位置的数,使用binary search
: 2.find the greatest index a bl[a]<=r
: if res = r + a - 1 not in blacklist, return res
: else
: while( res == bl[a]){
: res++;
: a++;
: }

avatar
a*l
22
群众意见又被无视了。

【在 c********y 的大作中提到】
: 我个人不喜欢放很多东西在置顶的,
: 不知道其它版务怎么认为。

avatar
s*x
23
这是你的面试题吗?还是考古看到的哈。
black list有说明是什么数据结构吗?
linkedlist,array or binary search tree?
avatar
x5
24
你难道想唱反调?

【在 a********l 的大作中提到】
: 群众意见又被无视了。
avatar
d*6
25
一用bs就不符合O(n)的要求吧,n个数都要搜一次,就是O(nlog(n))
一旦搜到有重复还得重新生成,生成完又搜一次,worst case会进入死循环的
我觉得mapping才是正道,traverse black list一次,用一个计数器i,每遇到bl中的
元素就跳到下一个,然后把i append到另外一个数组里,就得到map好的数组了
不过map会有问题的,生成的随机数不是平均分布的。你的题目说明不是很清楚,不是
平均分布的随机数有没有问题?

【在 f********a 的大作中提到】
: 怎么用二叉树的?
avatar
a*l
26
不敢,我低着头攒钱买1d4。不出声。

【在 x5 的大作中提到】
: 你难道想唱反调?
avatar
m*n
27
用map,随机数可以做到均匀分布。
我觉得这道题,面试官要的答案就是用map,这一点从follow up就可以看出来。
geek上的解答就是trash,用了就是死。
楼主的function API是自己写的,还是面试官给你?如果是自己写的,这种API一写出
来,就fail一半了。如果是面试官给的,丫就是存心要黑你了。

【在 d**********6 的大作中提到】
: 一用bs就不符合O(n)的要求吧,n个数都要搜一次,就是O(nlog(n))
: 一旦搜到有重复还得重新生成,生成完又搜一次,worst case会进入死循环的
: 我觉得mapping才是正道,traverse black list一次,用一个计数器i,每遇到bl中的
: 元素就跳到下一个,然后把i append到另外一个数组里,就得到map好的数组了
: 不过map会有问题的,生成的随机数不是平均分布的。你的题目说明不是很清楚,不是
: 平均分布的随机数有没有问题?

avatar
x*c
28
same

【在 c********y 的大作中提到】
: 我个人不喜欢放很多东西在置顶的,
: 不知道其它版务怎么认为。

avatar
b*i
29
不懂,为什么说这个API会fail?
int myRandom(int n, vector bl)
{
//.....
}
另外,如果map的话建立map的过程需要O(n)的复杂度,怎么实现O(lgn)?

【在 m*****n 的大作中提到】
: 用map,随机数可以做到均匀分布。
: 我觉得这道题,面试官要的答案就是用map,这一点从follow up就可以看出来。
: geek上的解答就是trash,用了就是死。
: 楼主的function API是自己写的,还是面试官给你?如果是自己写的,这种API一写出
: 来,就fail一半了。如果是面试官给的,丫就是存心要黑你了。

avatar
x5
30
和谐就好。。。

【在 a********l 的大作中提到】
: 不敢,我低着头攒钱买1d4。不出声。
avatar
w*x
31
这个题有点费劲,等我调好code,发上来

【在 f********a 的大作中提到】
: 怎么用二叉树的?
avatar
c*y
32
1d4我觉得也没多好啊,拍个猫,还是不行啊

【在 a********l 的大作中提到】
: 不敢,我低着头攒钱买1d4。不出声。
avatar
U*A
33
是不是可以这样理解题目。
如果需要输出的数产生的概率还是1/n的话,
如果用map的话,随机产生一个数,O(1)查找是不是bl中的数,如果是,那么就接着产
生下一个,要不然就输出。
如果需要输出的数的概率是1/(n-k)的话,
就只能像gfg把所有的数map一对一。然后随机产生(0,n-k)的index,输出index对应的
数就可以了。
avatar
K*t
34
pia

【在 c********y 的大作中提到】
: 1d4我觉得也没多好啊,拍个猫,还是不行啊
avatar
U*A
35
是不是可以这样理解题目。
如果需要输出的数产生的概率还是1/n的话,
如果用map的话,随机产生一个数,O(1)查找是不是bl中的数,如果是,那么就接着产
生下一个,要不然就输出。
如果需要输出的数的概率是1/(n-k)的话,
就只能像gfg把所有的数map一对一。然后随机产生(0,n-k)的index,输出index对应的
数就可以了。
avatar
x*3
36

1d4芯片面积是?

【在 a********l 的大作中提到】
: 不敢,我低着头攒钱买1d4。不出声。
avatar
w*x
37
下面这个应该是对的,思路是边用二叉树走blacklist,边生成随机数(在leaf上)。
int getnumber(int n, vector& bl) {
if (bl.size() > n) {
cout << " wrong, black list size error! ";
}

int low = 0, high = bl.size() - 1;
int os = 0, oe = n - 1;
double prob, u;
int length1, length2;
while (high > low) {
int mid = (high + low) / 2;
length1 = oe - bl[mid] - (high - mid);
length2 = oe - os - (high - low);
if (length2 > 0)
prob = (double) length1 / length2;
else
prob = 0;
u = rand() / (double) (RAND_MAX + 1);

if (prob <= u) {
//left
high = mid;
oe = bl[mid] - 1;
}
else {
//right
os = bl[mid] + 1;
low = mid + 1;
}
}
length1 = oe - bl[high];
length2 = oe - os;

prob = (double) length1 / length2;
u = rand() / (double) (RAND_MAX + 1);


if (prob <= u) {
int temp = bl[low] - os;
int number = rand() % temp + os;
return number;
}
else {
int temp = oe - bl[high];
int number = rand() % temp + bl[high] + 1;
return number;
}
}
avatar
c*y
38
1.3x
拍运动,速度和对焦,比幅面重要

【在 x*******3 的大作中提到】
:
: 1d4芯片面积是?

avatar
a*e
39
这种题会要求现场完整的写出来还是有思路写个大概就行了?感觉把题说明白都花不少
时间吧,45分钟能做3道?
avatar
r*n
40
阿婆拍的是人,又不拍猫。
1D4虽然不是全副,但是对焦看指标那是相当的nb,如果这样还不行,那还有啥涅?

【在 c********y 的大作中提到】
: 1d4我觉得也没多好啊,拍个猫,还是不行啊
avatar
w*5
41
这样好像可以
public static Random rand = new Random(System.currentTimeMillis());
public static int random(int n, int[] bl)
{
int r = rand.nextInt(n-bl.length);
if (bl.length==0 || rint offset = r - bl[0] + 1;
int left = 0, right=bl.length-1;
while (left+1 < right) {
int m = (left + right) / 2;
// number of non black list numbers on left
int available_nums = (bl[m] - bl[left]) - (m - left);
if (available_nums < offset) {
offset -= available_nums;
left = m;
} else {
right = m;
}
}
if (offset > (bl[right] - bl[left]) - (right - left)) {
offset++;
}
return bl[left] + offset;
}
avatar
x5
42
D3s,不折腾

【在 r*********n 的大作中提到】
: 阿婆拍的是人,又不拍猫。
: 1D4虽然不是全副,但是对焦看指标那是相当的nb,如果这样还不行,那还有啥涅?

avatar
w*x
43
这个好,想明白了,调试相对很容易。红包收下。
那啥,帅哥,合个影不?

【在 w**5 的大作中提到】
: 这样好像可以
: public static Random rand = new Random(System.currentTimeMillis());
: public static int random(int n, int[] bl)
: {
: int r = rand.nextInt(n-bl.length);
: if (bl.length==0 || r: int offset = r - bl[0] + 1;
: int left = 0, right=bl.length-1;
: while (left+1 < right) {
: int m = (left + right) / 2;

avatar
x*3
44

介个我知道只是一直没有记住是多少....
难道真让我36*24 /1.3算去?

【在 c********y 的大作中提到】
: 1.3x
: 拍运动,速度和对焦,比幅面重要

avatar
U*A
45
这样能保证0至n-1之间除了bl中的数字都是等概率输出?
1/(n-bl.size())

【在 w**5 的大作中提到】
: 这样好像可以
: public static Random rand = new Random(System.currentTimeMillis());
: public static int random(int n, int[] bl)
: {
: int r = rand.nextInt(n-bl.length);
: if (bl.length==0 || r: int offset = r - bl[0] + 1;
: int left = 0, right=bl.length-1;
: while (left+1 < right) {
: int m = (left + right) / 2;

avatar
c*y
46
没啥了,我满心欢喜的以为它能帮我拍好猫,看来我高估它了。。。

【在 r*********n 的大作中提到】
: 阿婆拍的是人,又不拍猫。
: 1D4虽然不是全副,但是对焦看指标那是相当的nb,如果这样还不行,那还有啥涅?

avatar
w*5
47
n = 10, bl --> [4,6,9]
r --> n-bl.size() --> [0, 6]
0 -> 0
1 -> 1
2 -> 2
3 -> 3
4 -> 5
5 -> 7
6 -> 8
数字都是等概率输出
avatar
x5
48
你啥时候跳的1D4?

【在 c********y 的大作中提到】
: 没啥了,我满心欢喜的以为它能帮我拍好猫,看来我高估它了。。。
avatar
f*a
49
写一个random函数,产生0 ~ n-1的数,但是有一个black list,产生的数不能在black
list里。 bl是sorted的。
int myRandom(int n, vector bl)
{
    //.....
}.
时间复杂度log(n)
这里是解
http://www.geeksforgeeks.org/forums/topic/generate-a-random-num
但问题是建立mapping的时候怎么样才能log(n)二分查找 找到下个不在bl里面的数?
follow up是设计一个分布式系统,可以往这个系统里面call一个function叫
getRandom(),每次call返回一个随机数,不能有重复。follow up不用考虑bl.
avatar
c*y
50
错啦
36*24/1.3^2

【在 x*******3 的大作中提到】
:
: 介个我知道只是一直没有记住是多少....
: 难道真让我36*24 /1.3算去?

avatar
j*4
51
空间复杂度有要求吗?

【在 f********a 的大作中提到】
: 写一个random函数,产生0 ~ n-1的数,但是有一个black list,产生的数不能在black
: list里。 bl是sorted的。
: int myRandom(int n, vector bl)
: {
:     //.....
: }.
: 时间复杂度log(n)
: 这里是解
: http://www.geeksforgeeks.org/forums/topic/generate-a-random-num
: 但问题是建立mapping的时候怎么样才能log(n)二分查找 找到下个不在bl里面的数?

avatar
x5
52
严格的是(36/1.3)*(24/1.3)

【在 c********y 的大作中提到】
: 错啦
: 36*24/1.3^2

avatar
w*x
53
不应该用map,直接产生随机数,然后在black list里走。这时可用二叉树了。

【在 f********a 的大作中提到】
: 写一个random函数,产生0 ~ n-1的数,但是有一个black list,产生的数不能在black
: list里。 bl是sorted的。
: int myRandom(int n, vector bl)
: {
:     //.....
: }.
: 时间复杂度log(n)
: 这里是解
: http://www.geeksforgeeks.org/forums/topic/generate-a-random-num
: 但问题是建立mapping的时候怎么样才能log(n)二分查找 找到下个不在bl里面的数?

avatar
c*y
54
跟着你跳的呗。。。

【在 x5 的大作中提到】
: 你啥时候跳的1D4?
avatar
Q*3
55
假设blacklist里有k个数
1.产生 一个[0,n - k) 的随机数:r=random(0,n - k)
问题就变成了,如何在whitelist里找到对应r这个位置的数,使用binary search
2.find the greatest index a bl[a]<=r
if res = r + a - 1 not in blacklist, return res
else
while( res == bl[a]){
res++;
a++;
}
if res not in blacklist, return res;
有时间写个程序验证一下
avatar
x5
56
靠,包子!

【在 c********y 的大作中提到】
: 跟着你跳的呗。。。
avatar
Q*3
57
以下程序有bug
int r = myRandom(100,bl);的时候,得到error>0
public class BlacklistRandom {
public static void main(String[] args) {
List bl = new ArrayList();
bl.add(2);
bl.add(4);
bl.add(6);
bl.add(9);
int error = 0;
for(int i=0;i<10000;i++){
int r = myRandom(10,bl);
if(r == 2 ||r == 4 || r == 6 || r == 9){
System.out.println(r);
error ++;
}
}
System.out.println("error count:"+error);
}
private static int myRandom(int n, List bl)
{
int r = new Random().nextInt(n - bl.size() + 1);
int middle = bl.size()/2;
int c = 0;
if(bl.get(middle) == r){
c = middle;
}else if(bl.get(middle) > r){
c = find(r,bl,0,middle);
}else{
c = find(r,bl,middle,bl.size() - 1);
}
if(c>0)
r = r + c - 1;
while(r == bl.get(c)){
r++;
c++;
}
return r;
}
private static int find(int r,List bl,int start,int end){
if(start ==end){
return start;
}else if(end == start +1){
if(r < bl.get(end))
return start;
else return end;
}
int middle = (start + end) /2;
int c = 0;
if(bl.get(middle) == r){
c = middle + 1;
}else if(bl.get(middle) > r){
c = find(r,bl,start,middle);
}else{
c = find(r,bl,middle,end);
}
return c;
}
}
avatar
r*n
58
发烧饼吧。。

【在 c********y 的大作中提到】
: 没啥了,我满心欢喜的以为它能帮我拍好猫,看来我高估它了。。。
avatar
c*1
59
black list不知道是不是sort的,如果是直接产生后再list中binary search即可。
follow up可能是找到list中的所有interval,然后分布在不同机器上。
avatar
c*y
60
有区别么? :(

【在 x5 的大作中提到】
: 严格的是(36/1.3)*(24/1.3)
avatar
n*n
61
看不懂你的题目

【在 f********a 的大作中提到】
: 写一个random函数,产生0 ~ n-1的数,但是有一个black list,产生的数不能在black
: list里。 bl是sorted的。
: int myRandom(int n, vector bl)
: {
:     //.....
: }.
: 时间复杂度log(n)
: 这里是解
: http://www.geeksforgeeks.org/forums/topic/generate-a-random-num
: 但问题是建立mapping的时候怎么样才能log(n)二分查找 找到下个不在bl里面的数?

avatar
x5
62
长宽比啊

【在 c********y 的大作中提到】
: 有区别么? :(
avatar
f*a
63
bl是sorted的。但是产生n-len(bl)-1的random number后怎么样binary search去除掉
bl里面的数,而得到正确地?

【在 c******1 的大作中提到】
: black list不知道是不是sort的,如果是直接产生后再list中binary search即可。
: follow up可能是找到list中的所有interval,然后分布在不同机器上。

avatar
r*n
64
D3s跟1D4比,优点就是全副,论对焦还不知道哪个强呢。

【在 x5 的大作中提到】
: D3s,不折腾
avatar
f*a
65
面试官没提。

【在 j*****4 的大作中提到】
: 空间复杂度有要求吗?
avatar
c*y
66
小学数学啊:
36*24/1.3^2 == (36/1.3)*(24/1.3)

【在 x5 的大作中提到】
: 长宽比啊
avatar
f*a
67
怎么用二叉树的?

【在 w****x 的大作中提到】
: 不应该用map,直接产生随机数,然后在black list里走。这时可用二叉树了。
avatar
x5
68
你那个解不唯一

【在 c********y 的大作中提到】
: 小学数学啊:
: 36*24/1.3^2 == (36/1.3)*(24/1.3)

avatar
f*a
69
看不太懂,因为indent不太清楚,大概跑了一下5-->7的例子,r==5不能得到res==7.

【在 Q********3 的大作中提到】
: 假设blacklist里有k个数
: 1.产生 一个[0,n - k) 的随机数:r=random(0,n - k)
: 问题就变成了,如何在whitelist里找到对应r这个位置的数,使用binary search
: 2.find the greatest index a bl[a]<=r
: if res = r + a - 1 not in blacklist, return res
: else
: while( res == bl[a]){
: res++;
: a++;
: }

avatar
x5
70
C家从一地图开始走了不少弯路,异地死才绕回来

【在 r*********n 的大作中提到】
: D3s跟1D4比,优点就是全副,论对焦还不知道哪个强呢。
avatar
s*x
71
这是你的面试题吗?还是考古看到的哈。
black list有说明是什么数据结构吗?
linkedlist,array or binary search tree?
avatar
c*y
72
555,我们不是学数学的,把数算对就行了,神马存在性唯一性啥的,就让F2他们学数
学的去考虑吧

【在 x5 的大作中提到】
: 你那个解不唯一
avatar
d*6
73
一用bs就不符合O(n)的要求吧,n个数都要搜一次,就是O(nlog(n))
一旦搜到有重复还得重新生成,生成完又搜一次,worst case会进入死循环的
我觉得mapping才是正道,traverse black list一次,用一个计数器i,每遇到bl中的
元素就跳到下一个,然后把i append到另外一个数组里,就得到map好的数组了
不过map会有问题的,生成的随机数不是平均分布的。你的题目说明不是很清楚,不是
平均分布的随机数有没有问题?

【在 f********a 的大作中提到】
: 怎么用二叉树的?
avatar
x5
74
咦,你不是学数学的?

【在 c********y 的大作中提到】
: 555,我们不是学数学的,把数算对就行了,神马存在性唯一性啥的,就让F2他们学数
: 学的去考虑吧

avatar
m*n
75
用map,随机数可以做到均匀分布。
我觉得这道题,面试官要的答案就是用map,这一点从follow up就可以看出来。
geek上的解答就是trash,用了就是死。
楼主的function API是自己写的,还是面试官给你?如果是自己写的,这种API一写出
来,就fail一半了。如果是面试官给的,丫就是存心要黑你了。

【在 d**********6 的大作中提到】
: 一用bs就不符合O(n)的要求吧,n个数都要搜一次,就是O(nlog(n))
: 一旦搜到有重复还得重新生成,生成完又搜一次,worst case会进入死循环的
: 我觉得mapping才是正道,traverse black list一次,用一个计数器i,每遇到bl中的
: 元素就跳到下一个,然后把i append到另外一个数组里,就得到map好的数组了
: 不过map会有问题的,生成的随机数不是平均分布的。你的题目说明不是很清楚,不是
: 平均分布的随机数有没有问题?

avatar
a*l
76
猫太难拍,懂得太厉害,要靠运气,多按快门多删片。

【在 c********y 的大作中提到】
: 1d4我觉得也没多好啊,拍个猫,还是不行啊
avatar
b*i
77
不懂,为什么说这个API会fail?
int myRandom(int n, vector bl)
{
//.....
}
另外,如果map的话建立map的过程需要O(n)的复杂度,怎么实现O(lgn)?

【在 m*****n 的大作中提到】
: 用map,随机数可以做到均匀分布。
: 我觉得这道题,面试官要的答案就是用map,这一点从follow up就可以看出来。
: geek上的解答就是trash,用了就是死。
: 楼主的function API是自己写的,还是面试官给你?如果是自己写的,这种API一写出
: 来,就fail一半了。如果是面试官给的,丫就是存心要黑你了。

avatar
a*l
78
不折腾,不活了。

【在 x5 的大作中提到】
: D3s,不折腾
avatar
w*x
79
这个题有点费劲,等我调好code,发上来

【在 f********a 的大作中提到】
: 怎么用二叉树的?
avatar
x*3
80

你俩明白那个意思就行了。。。
这是能灌啊

【在 x5 的大作中提到】
: 严格的是(36/1.3)*(24/1.3)
avatar
U*A
81
是不是可以这样理解题目。
如果需要输出的数产生的概率还是1/n的话,
如果用map的话,随机产生一个数,O(1)查找是不是bl中的数,如果是,那么就接着产
生下一个,要不然就输出。
如果需要输出的数的概率是1/(n-k)的话,
就只能像gfg把所有的数map一对一。然后随机产生(0,n-k)的index,输出index对应的
数就可以了。
avatar
x5
82
我不就是不明白么

【在 x*******3 的大作中提到】
:
: 你俩明白那个意思就行了。。。
: 这是能灌啊

avatar
U*A
83
是不是可以这样理解题目。
如果需要输出的数产生的概率还是1/n的话,
如果用map的话,随机产生一个数,O(1)查找是不是bl中的数,如果是,那么就接着产
生下一个,要不然就输出。
如果需要输出的数的概率是1/(n-k)的话,
就只能像gfg把所有的数map一对一。然后随机产生(0,n-k)的index,输出index对应的
数就可以了。
avatar
G*r
84
我晕死,
给个答案吧
拍娃的器材推荐三个精品置顶
拍猫的器材推荐三个精品置顶
一劳永逸吧~ ok~ 穿棉袄披棉被三伏天柏油马路跪求~
avatar
w*x
85
下面这个应该是对的,思路是边用二叉树走blacklist,边生成随机数(在leaf上)。
int getnumber(int n, vector& bl) {
if (bl.size() > n) {
cout << " wrong, black list size error! ";
}

int low = 0, high = bl.size() - 1;
int os = 0, oe = n - 1;
double prob, u;
int length1, length2;
while (high > low) {
int mid = (high + low) / 2;
length1 = oe - bl[mid] - (high - mid);
length2 = oe - os - (high - low);
if (length2 > 0)
prob = (double) length1 / length2;
else
prob = 0;
u = rand() / (double) (RAND_MAX + 1);

if (prob <= u) {
//left
high = mid;
oe = bl[mid] - 1;
}
else {
//right
os = bl[mid] + 1;
low = mid + 1;
}
}
length1 = oe - bl[high];
length2 = oe - os;

prob = (double) length1 / length2;
u = rand() / (double) (RAND_MAX + 1);


if (prob <= u) {
int temp = bl[low] - os;
int number = rand() % temp + os;
return number;
}
else {
int temp = oe - bl[high];
int number = rand() % temp + bl[high] + 1;
return number;
}
}
avatar
x5
86
相机说明书读了么?

【在 G**********r 的大作中提到】
: 我晕死,
: 给个答案吧
: 拍娃的器材推荐三个精品置顶
: 拍猫的器材推荐三个精品置顶
: 一劳永逸吧~ ok~ 穿棉袄披棉被三伏天柏油马路跪求~

avatar
a*e
87
这种题会要求现场完整的写出来还是有思路写个大概就行了?感觉把题说明白都花不少
时间吧,45分钟能做3道?
avatar
a*l
88
1d4的对焦我用不上那么高级的,也未必驾驭的了。
avatar
w*5
89
这样好像可以
public static Random rand = new Random(System.currentTimeMillis());
public static int random(int n, int[] bl)
{
int r = rand.nextInt(n-bl.length);
if (bl.length==0 || rint offset = r - bl[0] + 1;
int left = 0, right=bl.length-1;
while (left+1 < right) {
int m = (left + right) / 2;
// number of non black list numbers on left
int available_nums = (bl[m] - bl[left]) - (m - left);
if (available_nums < offset) {
offset -= available_nums;
left = m;
} else {
right = m;
}
}
if (offset > (bl[right] - bl[left]) - (right - left)) {
offset++;
}
return bl[left] + offset;
}
avatar
G*r
90
你先推荐吧,然后再读不迟

【在 x5 的大作中提到】
: 相机说明书读了么?
avatar
w*x
91
这个好,想明白了,调试相对很容易。红包收下。
那啥,帅哥,合个影不?

【在 w**5 的大作中提到】
: 这样好像可以
: public static Random rand = new Random(System.currentTimeMillis());
: public static int random(int n, int[] bl)
: {
: int r = rand.nextInt(n-bl.length);
: if (bl.length==0 || r: int offset = r - bl[0] + 1;
: int left = 0, right=bl.length-1;
: while (left+1 < right) {
: int m = (left + right) / 2;

avatar
c*y
92
那以后就天天成吵架帖了。。。

【在 G**********r 的大作中提到】
: 我晕死,
: 给个答案吧
: 拍娃的器材推荐三个精品置顶
: 拍猫的器材推荐三个精品置顶
: 一劳永逸吧~ ok~ 穿棉袄披棉被三伏天柏油马路跪求~

avatar
U*A
93
这样能保证0至n-1之间除了bl中的数字都是等概率输出?
1/(n-bl.size())

【在 w**5 的大作中提到】
: 这样好像可以
: public static Random rand = new Random(System.currentTimeMillis());
: public static int random(int n, int[] bl)
: {
: int r = rand.nextInt(n-bl.length);
: if (bl.length==0 || r: int offset = r - bl[0] + 1;
: int left = 0, right=bl.length-1;
: while (left+1 < right) {
: int m = (left + right) / 2;

avatar
c*y
94
啥时候告诉你我是学数学的了?

【在 x5 的大作中提到】
: 咦,你不是学数学的?
avatar
w*5
95
n = 10, bl --> [4,6,9]
r --> n-bl.size() --> [0, 6]
0 -> 0
1 -> 1
2 -> 2
3 -> 3
4 -> 5
5 -> 7
6 -> 8
数字都是等概率输出
avatar
x5
96
我的推荐就是先读说明书,其他免谈
别给杰克大师看见,要不又要骂了

【在 G**********r 的大作中提到】
: 你先推荐吧,然后再读不迟
avatar
c*1
97
public class RandomBlack {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
RandomBlack fac = new RandomBlack();
List> lss = fac.permu(9);
for(List ls : lss) {
for(int i = 1; i < 10; i++) {
int getRan = fac.getRan(ls, i);
int check = fac.check(ls, i);
if(getRan == check) continue;
else {
System.out.println("ls: " + ls);
System.out.println("i: " + i);
System.out.println("getRan: " + getRan + " chcek: " +
check);
}
}
}
// ArrayList bl = new ArrayList(Arrays.asList(new
Integer[]{1,3}));
// ArrayList bl2 = new ArrayList(Arrays.asList(new
Integer[]{1,3,4,6, 8, 11,12,13, 15, 19, 20, 22, 25}));
// //System.out.println("right: " + random(30, new int[]{1,3,4,6, 8,
11,12,13, 15, 19, 20, 22, 25}));
// System.out.println("6 :"+ getRan(new ArrayList(Arrays.
asList(new Integer[]{1,2,4,5,7})), 2));
// System.out.println("3 :"+ getRan(new ArrayList(Arrays.
asList(new Integer[]{1,2,4})), 1));
// System.out.println("3 :"+ getRan(new ArrayList(Arrays.
asList(new Integer[]{1,2,4,5,6,7})), 1));
// System.out.println("1 :"+ getRan(new ArrayList(Arrays.
asList(new Integer[]{2,3,4,5,6,7,8,9})), 1));
// System.out.println("2 :"+ getRan(new ArrayList(Arrays.
asList(new Integer[]{1,3})), 1));
// System.out.println("4 :"+ getRan(new ArrayList(Arrays.
asList(new Integer[]{1,3})), 2));

}
public List> permu(int n) {
List> out = new ArrayList>();
for(int i = 1; i < n; i++) {
List> tout = new ArrayList>();
for(List ls : out) {
List tls = new ArrayList(ls);
tls.add(i);
tout.add(tls);
}
List tls = new ArrayList();
tls.add(i);
out.add(tls);
out.addAll(tout);
}
return out;
}
public int getRan(List bl, int ranNum) {
int n = bl.size();
if(bl.isEmpty() || ranNum < bl.get(0) ) return ranNum;
if(bl.get(n - 1) - n < ranNum) return ranNum + n;
int s = 0;
int e = n - 1;
while(s + 1 < e) {
int m = (s + e) / 2;
int avi = bl.get(m) - m - 1;
if(m + 1 > e) break;
int aviN = bl.get(m + 1) - m - 2;
if(ranNum > aviN) {
s = m + 1;
}
else if(ranNum <= avi) {
e = m;
}
else {
if(avi == aviN) e = m;
else return ranNum + m + 1;
}
}
//return -1;
return ranNum + s + 1;
}

public int check(List bl, int ranNum) {
for(int i : bl) {
if(ranNum >= i) {
ranNum++;
} else {
break;
}
}
return ranNum;
}
}
有测试代码, 这题其实是在sort array中找最大的小于(target + index)的数,
ranNum相当于一个随机的数。
avatar
j*c
98
F2竞争当版主吧,然后把你受不了的帖子全咔嚓掉
avatar
x5
99
就这么觉得的

【在 c********y 的大作中提到】
: 啥时候告诉你我是学数学的了?
avatar
x*3
100

介是f2的mj?

【在 j****c 的大作中提到】
: F2竞争当版主吧,然后把你受不了的帖子全咔嚓掉
avatar
G*r
101
关闭评论功能
并注明仅供参考
这样就不会吵了
披棉被穿棉袄烈日跪柏油路声嘶力竭哭求

【在 c********y 的大作中提到】
: 那以后就天天成吵架帖了。。。
avatar
x*3
102

贪玩不是矿工吗额?

【在 x5 的大作中提到】
: 就这么觉得的
avatar
c*y
103
不是不是,IT混饭的

【在 x*******3 的大作中提到】
:
: 贪玩不是矿工吗额?

avatar
h*g
104
读说明书之前先了解什么叫光圈快门

【在 x5 的大作中提到】
: 我的推荐就是先读说明书,其他免谈
: 别给杰克大师看见,要不又要骂了

avatar
p*p
105
这你就不懂了,如果啥都置顶清晰了然,版上还有能这么多水么?现在还在鼓励灌水,
你却在这里唱反调:P

【在 G**********r 的大作中提到】
: 隔三差五就蹦出来一个问什么器材适合拍娃
: 到底是什么啊?~~~~
: 不如版主给出一个终结版,然后置顶吧~~~
: 三伏天烤火炉披棉被跪柏油马路吃辣椒火锅哭求版主同意~~~~

avatar
x*3
106

原来是同行啊
那块?
developer?network?DB?architect?

【在 c********y 的大作中提到】
: 不是不是,IT混饭的
avatar
T*r
107
终结者版拍娃器材:相机1D3,镜头随便选,记着多买几个floor lamp和全光谱灯泡,
外加一个430ex II和山寨的无线trigger。

【在 G**********r 的大作中提到】
: 隔三差五就蹦出来一个问什么器材适合拍娃
: 到底是什么啊?~~~~
: 不如版主给出一个终结版,然后置顶吧~~~
: 三伏天烤火炉披棉被跪柏油马路吃辣椒火锅哭求版主同意~~~~

avatar
T*r
108
1D3要么?

【在 a********l 的大作中提到】
: 不敢,我低着头攒钱买1d4。不出声。
avatar
a*l
109
多谢,暂时不打算升级机身,要买也想一步到位1d4。

【在 T********r 的大作中提到】
: 1D3要么?
avatar
c*y
110
回头我帮你泼冷水吧。。。

【在 a********l 的大作中提到】
: 多谢,暂时不打算升级机身,要买也想一步到位1d4。
avatar
a*l
111
猫这么难抓,1d4拍不了,谁又能呢?

【在 c********y 的大作中提到】
: 回头我帮你泼冷水吧。。。
avatar
c*y
112
所以不值3个7D的钱啊。。。

【在 a********l 的大作中提到】
: 猫这么难抓,1d4拍不了,谁又能呢?
avatar
a*l
113
你有空比较一下1d4和5d2的画质,看看是不是有的比,如果画质比7D好很多,加上传说
中的神奇高感表
现,也许值了。

【在 c********y 的大作中提到】
: 所以不值3个7D的钱啊。。。
avatar
c*y
114
高感没觉得有啥特别惊艳的
再好的高感,也不如低感好啊。。。

【在 a********l 的大作中提到】
: 你有空比较一下1d4和5d2的画质,看看是不是有的比,如果画质比7D好很多,加上传说
: 中的神奇高感表
: 现,也许值了。

avatar
a*l
115
7D低干也挺糙的,也许是我不行,阴天的时候,到了iso500就开始急剧下滑。

【在 c********y 的大作中提到】
: 高感没觉得有啥特别惊艳的
: 再好的高感,也不如低感好啊。。。

相关阅读
logo
联系我们隐私协议©2024 redian.news
Redian新闻
Redian.news刊载任何文章,不代表同意其说法或描述,仅为提供更多信息,也不构成任何建议。文章信息的合法性及真实性由其作者负责,与Redian.news及其运营公司无关。欢迎投稿,如发现稿件侵权,或作者不愿在本网发表文章,请版权拥有者通知本网处理。