题目一
1.题目:查找输入整数二进制中1
题目链接:查找输入整数二进制中1
2.思路
??一个二进制数 n-1 后与原二进制数进行 & 运算( 即 n&(n-1) )会消去最右边的1。
??因为 n&(n-1) 每次都消去最右边的 1,最终 1 全被消去会得到 0,所以有几个 1 就可以进行几次 n&(n-1)。
3.代码实现
题目二
1.题目:手套
题目链接:添加链接描述
2.思路
??假如左手边:[2,3,3,4] , 右手边[1,3,2,5]
??要想确保左边的全部颜色的手套都能取到并且是最小值,则:左手最小数:该数组和–该数组里除0外最小的数+1。
2+3+3+4-2+1=11
??要想确保右边的全部颜色的手套都能取到并且是最小值,则:右手最小数:该数组和–该数组里除0外最小的数+1
1+3+2+5-1+1 = 11
??为什么是除零以外的最小值呢?
我们看题目给的例子:左边[0,7,1,6] ,右边[1,5,0,6],按照我们刚刚公式,则左手边0+7+1+6-0=15,那么此时的最小值就大于了我们左手边手套的数量的,显示不符合逻辑。
??如果出现了0,那么我们需要把0这个颜色对应的另一边去掉。
3.代码实现
import java.util.*;
public class Gloves {
public int findMinimum(int n, int[] left, int[] right) {
int sum=0;
int leftMin=Integer.MAX_VALUE;
int rightMin=Integer.MAX_VALUE;
int rightSum=0;
int leftSum=0;
for(int i=0;i<n;i++){
if(left[i]*right[i]==0){
sum+=left[i]+right[i];
}else{
rightSum+=right[i];
leftSum+=left[i];
rightMin=Math.min(right[i],rightMin);
leftMin=Math.min(left[i],leftMin);
}
}
return sum+Math.min(leftSum-leftMin+1,rightSum-rightMin+1)+1;
}
}
|