google面试题

  google面试题

 

有n个人,其中超过半数是好人,剩下的是坏人
好人只说真话,坏人可能说真话也可能说假话
这n个人互相都知道对方是好人还是坏人

现在要你从这n个人当中找出一个好人来,只能通过以下方式:
每次挑出两个人,让这两个人互相说出对方的身份,
你根具两个人的话进行判断。

问通过何种方法才能最快的找出一个好人来,
(要考虑最坏的情况)

 

可能的答案:

思想是尽量多的排除坏人:
1,如果两个人都说对方是好人,那么有两种可能,要吗都是好人,要吗都是坏人.
2,如果有一个人说对方是坏人,那么两人种至少有一个坏人,可以同时排除,剩下的人照样满足条件好人站半树以上,再在剩下的人中找好人
   int    people[] = {0,1,1,1,1,0,0,0,1};//N个人的数组1是好人,0是坏人
    int    samePos = -1, sameNum = -1;
    while(i < N - 1)
    {
        if(samePos  != -1)
        {
            if(第samePos个人和第i个人都说对方是好人)
            {
              i++;
              sameNum++;
              if(sameNum > N/2)//超过一半,肯定都是好人
              {
               return people[samePos];
              }

 

            }
            else 
            {
                sameNum--;
                i++;
                if(sameNum == 0)
                {
                   samePos = -1;
                }
    
           }
                continue;  
        }
        
        if(第i个人和第i + 1个人都说对方是好人)
        {
           
               samePos = i;
               sameNum = 2;
        }
       else
       {
           i += 2;
       }
   }

    最后要吗剩下一个好人,要吗剩下一串好人,复杂度为o(n) ,最快n/2,最慢n.写的不太严密,请大家指正.

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值