源地址
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();
}