俩到经典题目
一.输入查找二进制中1的个数
题目描述:
解题分析
代码演示
import java.util.Scanner;
public class day15 {
// public static void main(String[] args) {
// //计算二进制中1的个数
// //计算二进制中1的个数
// Scanner scanner = new Scanner(System.in);
// while (scanner.hasNextInt()) {
// int n = scanner.nextInt();
// int count = 0;
// for (int i = 0; i < 32; i++) {
// if (((n >> i) & 1) == 1) {
// count++;
// }
// }
// System.out.println(count);
// }
// }
}
二.配对手套
题目描述:
解题分析
1.想要取到每一种颜色,分别要是每个手所有颜色的和-每个手颜色最少的手套数量,这样从另外一个手任意取一只(另一种手套对应颜色不为0),都可以取到对应颜色
2.计算左手和右手方案最小值为计算的和
3.如果存在一只手,颜色为0,即当另一只手再也无法取到该颜色,这种方案一定不可行,用sum记录另一只没有对应颜色手套,累加到计算的和中
1,3操作是独立的,即颜色种类为0时执行1,颜色种类不为0时执行3
核心公式: sum+min(letSum-leftMin+1,rightSum-right+1)+1;
代码演示
import java.util.*;
public class Gloves {
public int findMinimum(int n, int[] left, int[] right) {
// write code here
int leftSum=0;
int rightSum=0;
int leftMin=Integer.MAX_VALUE;
int rightMin=Integer.MAX_VALUE;
int sum=0;//当手套为0时,另一只手套的数量
for (int i = 0; i <n ; i++) {
if (left[i] * right[i] == 0) {
sum = left[i] + right[i] + sum;
} else {
leftSum += left[i];
if (leftMin > left[i]) {
leftMin = left[i];
}
rightSum += right[i];
if (rightMin > right[i]) {
rightMin = right[i];
}
}
}
return sum+Math.min(leftSum-leftMin+1,rightSum-rightMin+1)+1;
}
}