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