算法面试题之好多鱼

“好多鱼”这道题是牛客网的校园招聘题。

题目:

牛牛有一个鱼缸。鱼缸里面已经有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((maxSizeminSize)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);
    }
}

你可能感兴趣的:(算法面试题)