“好多鱼”这道题是牛客网的校园招聘题。
题目:
牛牛有一个鱼缸。鱼缸里面已经有n条鱼,每条鱼的大小为fishSize[i](1 ≤ i ≤ n,均为正整数),牛牛现在想把新捕捉的鱼放入鱼缸。鱼缸内存在着大鱼吃小鱼的定律。经过观察,牛牛发现一条鱼A的大小为另外一条鱼B大小的2倍到10倍(包括2倍大小和10倍大小),鱼A会吃掉鱼B。考虑到这个,牛牛要放入的鱼就需要保证:
1、放进去的鱼是安全的,不会被其他鱼吃掉
2、这条鱼放进去也不能吃掉其他鱼
鱼缸里面已经存在的鱼已经相处了很久,不考虑他们互相捕食。
现在知道新放入鱼的大小范围minSize,maxSize,牛牛想知道有多少种大小的鱼可以放入这个鱼缸。
输入描述:
输入数据包括3行.
第一行为新放入鱼的尺寸范围minSize,maxSize(1 ≤ minSize,maxSize ≤ 1000),以空格分隔。
第二行为鱼缸里面已经有鱼的数量n(1 ≤ n ≤ 50)
第三行为已经有的鱼的大小fishSize[i](1 ≤ fishSize[i] ≤ 1000),以空格分隔。
输出描述:
输出有多少种大小的鱼可以放入这个鱼缸。考虑鱼的大小都是整数表示
输入例子:
1 12
1
1
输出例子:
3
解决思路
首先,我们先认真审题,看看需要注意的地方:
1.鱼缸有n条鱼,每条鱼的大小为fishSize[i](1 ≤ i ≤ n,均为正整数);
2.鱼缸内存在着大鱼吃小鱼的定律:如果A大于B的大小2到10倍,则A可以吃掉B;
3.放进去的鱼和鱼缸里的鱼都需要安全,即,放进去的鱼的大小不能处于鱼缸的鱼的大小的2-10倍;
4.不考虑鱼缸里的鱼互相捕食;
5.新放入鱼的大小范围minSize,maxSize;
6.目的:有多少种大小的鱼可以放入鱼缸;
7.输入值:新放的鱼的尺寸范围minSize,maxSize(1 ≤ minSize,maxSize ≤ 1000),鱼缸里鱼的数量n(1 ≤ n ≤ 50),鱼缸里鱼的大小fishSize[i](1 ≤ fishSize[i] ≤ 1000)
8.输出值:有多少种大小的鱼可以放入这个鱼缸。
理解完题目的意思后,下面,我们再想如何高效地解决这个问题,题目要求有多少种大小的鱼可以放入鱼缸,而鱼的大小在minSize到maxSize内,所以,新的鱼的每个可能的大小和鱼缸的每条鱼都要遍历到,故时间复杂度最低是 O((maxSize−minSize)∗n) ,或者,可以以空间换时间。下面,直接上Java代码:
public class Fish {
public int manyFish(int minSize, int maxSize, int n, int[] fishSize){
// 检查输入值合法性
if(minSize <= 0 || minSize > 1000 || maxSize <= 0 || maxSize > 1000 || minSize > maxSize)
throw new IllegalArgumentException("输入值minSize或maxSize不合法");
if(n < 1 || n > 50)
throw new IllegalArgumentException("输入值n不合法");
if(fishSize.length != n)
throw new IllegalArgumentException("输入值fishSize不合法");
for(int i = 0;i < n;i++){
if(fishSize[i] < 1 || fishSize[i] > 1000)
throw new IllegalArgumentException("输入值fishSize不合法");
}
// 开始遍历
int num = 0;//新放的鱼的种类
int i;
for(int size = minSize;size <= maxSize;size++){
for(i = 0;i < n;i++){
if((size >= 2*fishSize[i] && size <= 10*fishSize[i])
|| (fishSize[i] >= 2*size && fishSize[i] <= 10*size)){
break;
}
}
if(i == n){
System.out.println(size);
num++; // 说明这条鱼的大小是合格的
}
}
return num;
}
public static void main(String[] args) {
Fish fish = new Fish();
int minSize = 1;
int maxSize = 12;
int n = 1;
int[] fishSize = {1};
int num = fish.manyFish(minSize, maxSize, n, fishSize);
System.out.println(num);
}
}