生活中的刺激——2016/06/09

难得的机会被错失,感觉还是自己水平不够,同时由于自己的心理不够强大,面对紧张时,脑子里会一片空白。并且,我不习惯将自己不成熟的思考表述出来,临场表现能力欠缺,有待改善。
下面记录一下遇到的卡住我的那道面试题:
小A和小B玩游戏,游戏设置有一个非负整数数组nums和一个非负整数target。小A要想赢必须要从数组中挑出一组不少于2个的数字,使得所挑出的数按位相或能够得到target。而小B若想赢,则必须从数组中删除一些数,使得小A无法赢,即使得余下的数组无论如何挑选,按位相或的结果都得不到target。问:小B若想赢,最少需要删除多少个数?

分析:操作是按位相或,1|1=1,1|0=1,0|1=1,0|0=0. 如果target的某一位是0,则若不想按位相或得0,必须使得剩余数组中对应位全部是1;如果target的某一位是1,则若不想按位相或得1,则必须使得剩余数组中对应位没有1,即删除在对应位是1的数小B就可以赢。所以:
1)target对应位是0,则删除全部的数组中对应位是0的数
2)target对应位是1,则去掉那些target对应位是0而其对应位是1的数组中的数之后,删除target对应位是1且数组中对应位是1的那些数。
而由上面两种情况,2)所删除的数的个数一定少于1)所删除的数。所以最终的结果就是2)

public countBnums(int[] nums,int target){
    int mincount=Integer.MAX_VALUE;
    int temptarget=target;
    while(temptarget!=0){
        int temp=temptarget&(temptarget-1);
        int count=0;
        for(int i=0;i<nums.length;i++){
            //target对应位是0且num对应位是1,target对应位是1且num对应位是1的那些数
            if((nums[i]&(~target)!=0)&&(nums[i]&(temptarget-temp))!=0)
                count++;
        }
        temptarget=temp;
    }
    if(mincount>count)
        mincount=count;
    return mincount;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值