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();
    }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章