难得的机会被错失,感觉还是自己水平不够,同时由于自己的心理不够强大,面对紧张时,脑子里会一片空白。并且,我不习惯将自己不成熟的思考表述出来,临场表现能力欠缺,有待改善。
下面记录一下遇到的卡住我的那道面试题:
小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;
}