今天笔试的两道题目,欢迎大家讨论

success041000 2011-04-10 09:09:33
1、一道概率题,印象很深。
两个20*20的正方形,在100*100的正方形范围内重叠或接触的概率。小正方形与大正方形边平行或接触。0.0625
我的思路:设两个正方形的左上角顶点坐标分别为(x1,y1),(x2,y2)。则两点之间的距离小于小正方形的对角线长度的概率。(x1-x2)^2+(y1-y2)^2<=20^2+20^2。而小正方形左上角顶点只能在大正方形80*80的范围内。最后求的是(20^2+20^2)/(80^2+80^2)=0.0625。一道选择题,时间紧没有细想,也没太好的思路。
2、编程题:
一维空间,一个整数代表一个点。给一个长度为N的数组,求包含至少[N/2](下值,6/2取3;7/2取3)的区间。
ex:{5,-3,-1,10,12,-5}那么区间[-5,-2`]
输入:一整数数组,数组的长度
返回数组这个区间
要求尽量完整,高效。不能用已有的库。
思路:对重复点的考虑(是算一个点,还是看做多个点),貌似看做一个点更合理,那应该对数组预处理,对重复的点保存一个副本。没有太好的思路,我是用快速排序做的想着时间复杂度是O(nlogn)。没有对重复点进行删除(光写了下思路)。感觉有点像topK 小问题。

还要给出测试用例,即结果。

欢迎大家讨论!

...全文
945 37 打赏 收藏 转发到动态 举报
写回复
用AI写文章
37 条回复
切换为时间正序
请发表友善的回复…
发表回复
兔子先生-zhang 2012-04-02
  • 打赏
  • 举报
回复
[Quote=引用 36 楼 的回复:]
上一个写错了 应该是197/625
[/Quote]
我把大正方形区域分成三种情况考虑,结果是169/625,请教你的197/625是怎么算的?
  • 打赏
  • 举报
回复
上一个写错了 应该是197/625
  • 打赏
  • 举报
回复
169/625
success041000 2011-04-15
  • 打赏
  • 举报
回复
不影响题目的解答,题目是英文的,没记清楚。[Quote=引用 31 楼 rockics 的回复:]


[/Quote]
Rockics 2011-04-15
  • 打赏
  • 举报
回复

不错 我计算到7/16以后 不知道往下如何分析

这个7/16 也可以这样考虑 随机变量X,Y,都服从[0,80]上的均匀分布,求P{|X-Y|<=20},求出来就是7/16了。也就是delphiguy说的14/32

至于往下怎么分析,还在考虑中

[Quote=引用 10 楼 delphiguy 的回复:]

引用 6 楼 delphiguy 的回复:

第一题应该是16/625(0.0256)吧。


啊。错了。
这题可以转化为类似问题:长度为80的线段,上面有两个随机点,问两点之间的距离不超过20的概率。
可以将长度分为三个区间:(0,20)、(20,60)、(60,80)
点A落在三个区间的概率分别是1/4、1/2、1/4
对于区间1,点B与A的距离不超过20的概率为(A+20……
[/Quote]
Rockics 2011-04-15
  • 打赏
  • 举报
回复
题目是说: 小正方形与大正方形边平行或垂直,不是接触,呵呵
[Quote=引用楼主 success041000 的回复:]
1、一道概率题,印象很深。
两个20*20的正方形,在100*100的正方形范围内重叠或接触的概率。小正方形与大正方形边平行或接触。0.0625
我的思路:设两个正方形的左上角顶点坐标分别为(x1,y1),(x2,y2)。则两点之间的距离小于小正方形的对角线长度的概率。(x1-x2)^2+(y1-y2)^2<=20^2+20^2。而小正方形左上角顶点只能在大正方形80*80的范围内。最……
[/Quote]
babalaka 2011-04-12
  • 打赏
  • 举报
回复
我觉得应该是重复数算多个点,原因如下:
1. 题目要求区间至少(at least)包含N/2(下取整)个点,并不是只能是N/2个。如果重复数算做一个点,那输入的N是不是又要随着重复数的个数调整呢?不然也许合并了重复数据之后的元素个数就已经比N/2小了,直接不符合题意。
2. 重复数算做多个点并不违背题意。因为题目要求是at least,对于{-5,-3,-3,-3,-2,3}来说,输出为{-5,-3}是符合题意的(包含4个点,大于3个)。

这是我的看法,希望大家指正。
head2161 2011-04-12
  • 打赏
  • 举报
回复
你们看那个能不能转化为两个正方形能同时在40*40 中的概率啊
wippo 2011-04-12
  • 打赏
  • 举报
回复
照原来理解的话,用冒泡排序排一半,再把排序好的数据首尾输出就好了
success041000 2011-04-12
  • 打赏
  • 举报
回复
不对吧!那是不是要求序列中的数的个数是数组长度的一半。照这么说的话,例子中[5,12]岂不是比[-5,-2]差值更大,但是结果是[-5,-2].[Quote=引用 18 楼 wippo 的回复:]

跟我一样,对第二个题理解有误,不是让你求最小数和中间那个数的,我们被例子误导了。。。。意思是排序后,找到一个子序列,两边的差值最大
[/Quote]
success041000 2011-04-12
  • 打赏
  • 举报
回复
题目也没有明确说,大家可以发散思维,说的过去就OK。当然我只是记住了题目的大概意思,。[Quote=引用 24 楼 babalaka 的回复:]

我觉得应该是重复数算多个点,原因如下:
1. 题目要求区间至少(at least)包含N/2(下取整)个点,并不是只能是N/2个。如果重复数算做一个点,那输入的N是不是又要随着重复数的个数调整呢?不然也许合并了重复数据之后的元素个数就已经比N/2小了,直接不符合题意。
2. 重复数算做多个点并不违背题意。因为题目要求是at least,对于{-5,-3,-3,-3,-2,3}来说,输出为{-……
[/Quote]
success041000 2011-04-12
  • 打赏
  • 举报
回复
原话:小正方形与大正方形边平行或接触。这个边当然是指四条边啦。不是只有底盘的边平行。[Quote=引用 26 楼 njusthsy 的回复:]

还有我不太懂的是,到底这两个小正方形能不能斜过来重叠呢。。。感觉题目里也没说清啊。。。哎,只说小正方形的边要和底盘的边平行的
[/Quote]
success041000 2011-04-12
  • 打赏
  • 举报
回复
这个我也想到了,考虑效率的问题,选择了快排。也许还有更好的解法,不用排序。[Quote=引用 22 楼 wippo 的回复:]

照原来理解的话,用冒泡排序排一半,再把排序好的数据首尾输出就好了
[/Quote]
fight_flight 2011-04-12
  • 打赏
  • 举报
回复
修改了一下

#include<iostream>
using namespace std;

void quick_sort(int a[],int b,int e){//前闭后开
if(e-b<=1)return;
int t=a[b];
int i=b,j=e+1;
while(true){
do{++i;}while(i<e&&a[i]<t);
while(a[--j]>t);
if(i>=j)break;
int temp=a[i];
a[i]=a[j];
a[j]=temp;
}
a[b]=a[j];
a[j]=t;
quick_sort(a,b,j);
quick_sort(a,j+1,e);
}

int main(){
int array[]={5,-2,-1,10,15,-5};
int l=sizeof(array)/4;
quick_sort(array,0,l);

int k=l/2;
int min=array[0],max=array[1];
for(int m=0,n=1;n<l;){
int spa=array[n]-array[m];
if(spa<k){
++n;
continue;
}
else if(spa==k){
max=array[n];
min=array[m];
break;
}
else{
if(max-min<k||(max-min>k&&spa<max-min))
max=array[n],min=array[m];
++m;
}
}

cout<<min<<" "<<max<<endl;

return 0;
}
njusthsy 2011-04-12
  • 打赏
  • 举报
回复
还有我不太懂的是,到底这两个小正方形能不能斜过来重叠呢。。。感觉题目里也没说清啊。。。哎,只说小正方形的边要和底盘的边平行的
njusthsy 2011-04-12
  • 打赏
  • 举报
回复
[Quote=引用 23 楼 head2161 的回复:]
你们看那个能不能转化为两个正方形能同时在40*40 中的概率啊
[/Quote]

我觉得可以,当时就是这么想的,但还是没做出来!但,如果有一个20*20的小正方形位于100*100的底座的中间区域时,要考虑60*60的情况的(上下左右),然后就算不出来了
fight_flight 2011-04-11
  • 打赏
  • 举报
回复
不知第二题和topk问题怎么俩系起来,

一个N*log(N)

#include<iostream>
using namespace std;

void quick_sort(int a[],int b,int e){//前闭后开
if(e-b<=1)return;
int t=a[b];
int i=b,j=e+1;
while(true){
do{++i;}while(i<e&&a[i]<t);
while(a[--j]>t);
if(i>=j)break;
int temp=a[i];
a[i]=a[j];
a[j]=temp;
}
a[b]=a[j];
a[j]=t;
quick_sort(a,b,j);
quick_sort(a,j+1,e);
}

int main(){
int array[]={5,-3,-1,10,-2,-5};
int l=sizeof(array)/4;
quick_sort(array,0,l);
for(int i=0;i<l;++i)
cout<<array[i]<<endl;

int k=l/2;
int min=array[0],max=array[1];
for(int m=0,n=2;n<l;){
int spa=array[n]-array[m];
if(spa<k){
++n;
continue;
}
else if(spa==k){
max=array[n];
min=array[m];
break;
}
else{
if(max-min<k||(max-min>k&&spa<max-min))
max=array[n],min=array[m];
}
}

cout<<max<<" "<<min<<endl;

return 0;
}
dbhme 2011-04-11
  • 打赏
  • 举报
回复
第一题,两点之间的距离小于小正方形的对角线长度时,不一定有重叠/接触吧。好象需要分别求x方向距离和y方向距离都<=20才能能保证有重叠/接触。
bingo24 2011-04-11
  • 打赏
  • 举报
回复
Input:{5,-3,10,12,-2,-5},Output:[-5,-2]包含3个点。题目应该是这样
绿色夹克衫 2011-04-11
  • 打赏
  • 举报
回复
顶一下10楼DelphiGuy的答案吧!
加载更多回复(15)

33,008

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧