美团网哈工大研发2014笔试

转载请注明引用 :blog.csdn.net/makamus    版权所有@makamus
欢迎大家关注本人博客,技术交流请加QQ:508742012


1、一堆硬币,一个机器人,如果是反的就翻正,如果是正的就抛掷一次,无穷多次后,求正反的比例
首先设硬币的正反概率分别为p  、  p        ,第一次后 p 正1 =   p +1/2 p    , p 反1 =   1/2 p        
                    
2、概率题:一个汽车公司的产品,甲厂占40%,乙厂占60%,甲的次品率是1%,乙的次品率是2%,现在抽出一件汽车是次品,问是甲生产的可能性
    甲的次品占公司40%* 1%=0.004;乙次品占公司产品60%*2%=0.012;总次品占所有产品为0.016;现已知是次品,则为甲的概率为1/4=25%。
3、 有100盏灯(它们的位置编号为1, 2 .. 99,100),刚开始全都是灭着的。第一次把所有的灯都打开,第二次把偶数位置上的灯灭了,第三次把位置是3的倍数的灯原来灭的打开,原来打开着的,灭了。第N次把位置是N的倍数的灯原来灭的打开,原来打开着的,灭了。问第100次后还有多少盏灯亮着的? 
int arrDeng[101];
void doWithArr(int arr[],int n){
/*memset(arr,0,101);*/
int k;
for(int i=1;i<=100;i++){
k=1;
while(i*k<=100){
if(arr[i*k]==0){
arr[i*k]=1;
}else{
arr[i*k]=0;
}
k++;
}
}
for(int i=1;i<=100;i++){
if(arr[i]==1){
printf("%d ",i);
}

}
}
 

 

来源于[http://www.howwant.com/category/brain-food/]有100盏灯,从1~100编上号,开始时所有的灯都是关着的。
第一次,把所有编号是1的倍数的灯的开关状态改变一次;
第二次,把所有编号是2的倍数的灯的开关状态改变一次;
第三次,把所有编号是3的倍数的灯的开关状态改变一次;
以此类推,直到把所有编号是100的倍数的灯的开关状态改变一次。
问,此时所有开着的灯的编号。

【分析】

由于最开始灯是灭的,那么只有经过奇数次改变开关状态的灯是亮的。根据题意可知一个数字有多少约数就要开关多少次,所以最后亮着的灯的数学解释就是:灯的编号有奇数个不同的约数。
一个数的约数按出现的奇偶个数分为以下两种:
 约数是成对出现的,比如8的约数对为:(1,8)、(2,4)。
 约数是单个出现的,比如36的约数对为:(1,36)、(2,18)、(3,12)、(4,9)、(6)。
可以看出6自己单独是36的约数,而不是和别的数连在一起。所以只有平方数才会有奇数个整型约数,才满足本题的要求。从1到100的平方数为:
1,4,9,16,25,36,49,64,81,100。
所以只有这些灯是亮的。

【答案】

编号为1,4,9,16,25,36,49,64,81,100的灯是亮的。

说明:本题是一道数学类型题目,但是绝对不能用简单的计算法来解决本题,那样的计算量太庞大,所以用分析法加计算法来分析才是正确简单的解决本题的最佳途径。

 

4、链表翻转。给出一个链表和一个数k,比如链表1→2→3→4→5→6,k=2,则翻转后2→1→4→3→6→5,若k=3,翻转后3→2→1→6→5→4,若k=4,翻转后4→3→2→1→5→6,用程序实现

struct ListNode
{
    int       m_nValue;
    ListNode* m_pNext;
};

ListNode* reverse(ListNode **head){
ListNode *p,*r,*pHead=*head;
if(pHead&&pHead->m_pNext){
p=pHead;
r=p->m_pNext;
p->m_pNext=NULL;
while(r){
p=r;
r=r->m_pNext;
p->m_pNext=pHead;
pHead=p;
}
}
return pHead;
}

ListNode* reversePerKNode(ListNode*  head,int k){
if(head==NULL||k<2)
return head;
int i=0;
ListNode *p=head,*pre=NULL,*tp=NULL;
while(p){
 ListNode *PH=p;
 i=0;
 while(p&&i<k){
i++;
pre=p;
p=p->m_pNext;
 }
 pre->m_pNext=NULL;
 if(i==k){
 if(tp==NULL){
 tp=reverse(&PH);
 head=tp;
 tp=PH;
 }else{
 tp->m_pNext=reverse(&PH);
 tp=PH;
 }
 }else{
 tp->m_pNext=PH;
 }

}
return head;
}
5、一个函数access(),调用频率不能超过R次/sec,用程序实现一个函数,当超过R次/sec时返回access false,不超过时返回success
int g_count;
access(){
  g_count++;
}

bool method(){
  time_t start,finish;
  time(&start);
  delay(5);
  time(&finish);
  if(g_count/(finish-start)>R)
    return false;
  else
    return success;
}
6、一个m*n的矩阵,从左到右从上到下都是递增的,给一个数elem,求是否在矩阵中,给出思路和代码
首先直接定位到最右上角的元素,再配以二分查找,比要找的数(6)大就往左走,比要找数(6)的小就往下走,直到找到要找的数字(6)为止
bool findFun(int *arr,int m,int n,int t){
int i=0,j=n-1;
while(i<m&&j>=0){
if( *(arr+i*n+j)>t)
j--;
else if(*(arr+i*n+j)<t)
i++;
else
return true;
}
return false;
}
JAVA版
 public static  int  find(int arr[][],int m,int n, int t){
        int i=0,j=n-1;
        while(i<m&&j>=0){
 if(arr[i][j]>t)
j--;
 else if(arr[i][j]<t)
i++;
 else
return 1;
     }
        return -1;
    }













posted on 2013-10-31 20:55  you Richer  阅读(317)  评论(0编辑  收藏  举报