zoukankan      html  css  js  c++  java
  • 美团网哈工大研发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;
        }













  • 相关阅读:
    背水一战 Windows 10 (26)
    背水一战 Windows 10 (25)
    背水一战 Windows 10 (24)
    背水一战 Windows 10 (23)
    背水一战 Windows 10 (22)
    背水一战 Windows 10 (21)
    背水一战 Windows 10 (20)
    背水一战 Windows 10 (19)
    背水一战 Windows 10 (18)
    背水一战 Windows 10 (17)
  • 原文地址:https://www.cnblogs.com/riskyer/p/3400109.html
Copyright © 2011-2022 走看看