算法面试题之好多鱼

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

题目:

牛牛有一个鱼缸。鱼缸里面已经有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);
    }
}
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
/*主框架类*/ import java.awt.*; import java.awt.event.*; import javax.swing.*; public class MyJFrame extends JFrame { private static final long serialVersionUID = 1L; public MyJFrame()//构造方法 { init();//自定义方法1 setVisible(true);//可见 } private void init()//自定义方法 { Toolkit tlk = Toolkit.getDefaultToolkit(); Image tittle = tlk.getImage("pho/最小化.png");//添加最小化图标 setIconImage(tittle); setUndecorated(true);//不启用标栏 MyJPanel jpanel=new MyJPanel(); setContentPane(jpanel);//作用类似于add() setSize(1200,700);//设置窗口大小 setResizable(false);//不可改变大小 setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//关闭 setLocationRelativeTo(null);//窗口出现在桌面中间 /*******把鼠标隐藏*****/ Toolkit tool = Toolkit.getDefaultToolkit(); Image mouse=tool.getImage("pho/mouse.png");//给鼠标加一张透明的图片 Cursor cursor = tool.createCustomCursor(mouse,new Point(),null); setCursor(cursor); addKeyListener((KeyListener) new MyKeyAdapter());//设置键盘监听,用来退出游戏 } private class MyKeyAdapter extends KeyAdapter//键盘监听适配器 { public void keyPressed(KeyEvent e) { super.keyPressed(e); int event = e.getKeyCode();//接受键盘事件 if(event == KeyEvent.VK_ESCAPE)//按ESC退出 { int result = JOptionPane.showConfirmDialog(null, "是否退出游戏", "提示", JOptionPane.OK_CANCEL_OPTION); if(result == JOptionPane.OK_OPTION)//点击确定退出 { System.exit(0); } } } } }

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值