Lesson 7 question 2 Fish

源地址

https://app.codility.com/programmers/lessons/7-stacks_and_queues/fish/

Fish(鱼)

给定含有N个整数的2个非空数组A和B,表示一条河里的N条贪婪的鱼.沿着河的方向顺流而下.
鱼被标记为0到N-1,如果P和Q是两条鱼,而P<Q,那么P在Q的上游.在初始状态,每条鱼都有自己唯一的位置.
鱼P被A[P]和B[P]表示.A表示鱼的尺寸,所有的元素都是不重复的.B表示鱼的方向,只包含0或者1.

  • 0表示鱼往上游
  • 1表示鱼往下游

如果两条鱼的方向是相对的,并且他们之间没有其他的鱼,他们最终会遇到彼此.只有一条鱼会或下来,大鱼会吃掉小鱼.更准确的说,当P<Q,B[P]=1、B[Q]=0并且他们之间没有鱼的时候,鱼P和鱼Q会相遇.这时:

  • 如果A[P]>A[Q],P吃掉Q,并且继续往下游
  • 如果A[P]<A[Q],Q吃掉P,并且继续往上游

假设所有的鱼的速度是一样的.也就是说,相同方向的鱼是不会遇到的.目标是计算最有有多少条鱼会活下来.
比如有如下的A和B:

  A[0] = 4    B[0] = 0
  A[1] = 3    B[1] = 1
  A[2] = 2    B[2] = 0
  A[3] = 1    B[3] = 0
  A[4] = 5    B[4] = 0

最初所有的鱼都是活着的.1号鱼会往下游,1号鱼碰到2号鱼并且吃掉2号鱼,然后碰到3号鱼吃掉3号鱼,然后碰到4号鱼被4号鱼吃掉,最后只留下两条鱼,0号鱼和4号鱼.
写一个函数

	class Solution { 
		public int solution(int[] A, int[] B); 
	}

给定包含N个整数的两个非空数组A和B,返回最后或者的鱼的数量
比如给定如上的两个数组,返回2.
假定:

  • N是范围在 [1…100,000]的整数
  • A中的每个元素都是范围在 [0…1,000,000,000]的整数
  • B中的每个元素都只能是 0或者1
  • A中的元素是不重复的

第一步

仍然是自定义自己的Stack,从上游开始依次放入鱼,如果方向相对,留下尺寸更大的那一个,最后返回stack的size即可.

	final static int UPSTREAM = 0;
    final static int DOWNSTREAM = 1;

    class FishEntity {
        int size;
        int direction;

        FishEntity(int s, int d) {
            size = s;
            direction = d;
        }
    }

    class Stack {
        ArrayList<FishEntity> list = new ArrayList<FishEntity>();

        int size() {
            return list.size();
        }

        FishEntity peek() {
            return list.get(size() - 1);
        }

        void pop() {
            list.remove(size() - 1);
        }

        void push(int fishSize, int direction) {
            if (size() == 0) {
                list.add(new FishEntity(fishSize, direction));
                return;
            }
            boolean addFlg = true;
            while (size() > 0) {
                FishEntity preFish = peek();
                if (preFish.direction == DOWNSTREAM && direction == UPSTREAM) {
                    if (preFish.size < fishSize) {
                        pop();
                    } else {
                        addFlg = false;
                        break;
                    }
                } else {
                    break;
                }
            }
            if (addFlg) {
                list.add(new FishEntity(fishSize, direction));
            }
        }
    }

    public int solution(int[] A, int[] B) {
        Stack s = new Stack();
        int N = A.length;
        for (int i = 0; i < N; i++) {
            s.push(A[i], B[i]);
        }
        return s.size();
    }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章