笔试题一
题目描述:
输入n个数,让你从中选k个数做&运算,即位运算中的与运算,现在从所有方案中,将这k个数&一起的最小值是多少?
输入描述
输入第一行有一个整数T,代表接下来有T组测试数据
对于每一组测试数据第一行输入两个数n和k,代表数的个数以及要选择的个数
接下来n个数,代表每一个数的大小
1<=n<=40
1<=T<=10
1<=a[i]<=2^60
输出描述
对于每组数据输出一行代表所能选取的最小值。
实例1 输入输出实例仅供测试,后台测试数据一般不包含该实例
输入
2
3 2
5 6 7
8 2
238 153 223 247 111 252 253 247
输出
4
9
说明
&运算是将两个数转为二进制对应位置运算,若都是1,结果也为1,否为0.
例如:7&4 转为二进制为:111&100&100,转换为十进制为4,故答案为4
这个题,能力较好的人来说,应该不难,但是对我这个菜鸟来说,可是折腾了好久,主要的难点是对于输入这一块,一直没写对,其它地方的逻辑感觉都是没问题的,真的是欲哭无泪啊,虽然最后写出来了,但是没赶上时间点提交。也是没办法了。虽然后面自己IDEAL上通过了测试数据,但是不保证对,有其它想法的小伙伴们欢迎给我评论。
思路:
首先明确:位运算就是直接对整数的二进制位进行操作
1、按照题目意思写完成输入数据的函数
2、对输入的数据,进行从小到大的排序,从头开始选取k个数进行&运算。最后返回结果即可。
感觉第二步是真的简单,所以这里主要是完成第一步。
Java代码如下
public void InputData(){
Scanner scanner1=new Scanner(System.in);
int T = scanner1.nextInt(); //代表有几组测试数据
while (T!=0){
Scanner scanner=new Scanner(System.in);
//输入第一组测试数据
//测试数据都只有两个,并且位于同一行,这里使用nextLine方法,得到的是字符串
String s = scanner.nextLine();
//将输入的字符串转为字符数组以空格隔开
String[] testData = s.split(" ");
//测试数据第一个数表示数的个数
int n=Integer.parseInt(testData[0]);
//测试数据第二个数表示从n个数中选取出k个数2
int k = Integer.parseInt(testData[1]);
//定义一个数组,长度为n,用来存储后面输入的n个数
int a[] =new int[n];
String s2 = scanner.nextLine();
String[] allData = s2.split(" ");
for (int i = 0; i < n; i++) {
a[i]=Integer.parseInt(allData[i]);
}
//以上就实现了对第一组测试数据的输入
//此时就需要从第一组测试数据中选取出k个数进行&运算
int i = minValue(k, a);
System.out.println(i);
//进行下一组数据的测试
T--;
}
}
//求数组中选出k个数&运算的最小值
public int minValue(int k,int[] a){
Arrays.sort(a); //对数组进行从小到大排序
int sum=a[0];
for (int i = 1; i < k; i++) {
sum=sum & a[i];
}
return sum;
}
不对的地方欢迎指出!