60分钟,两道编程题,只需要填写函数体。
1.货车司机单向装卸货问题(类似股票交易)
货车司机的火车可以最多承载capacity吨货物,因为要顺路,车只能朝一个方向开不能调头,一份货运清单,清单里每一条包括(要载的重量,起点,终点)。根据火车载重量和货运清单,判断是否能够成功顺路回家,只有所有订单都能被完成时才返回true,其他返回false。假设在所有的站点都是先卸货再装货。
思路1(当时忘了排序,只通过了40%,不知道是不是没排序才导致没全通过)
public boolean truckGo (int[][] load, int capacity) {
if(load[0].length==0) return true;
List<Integer> state = new ArrayList<>();
for(int i=0;i<load.length;i++){
if(!state.contains(load[i][1])) state.add(load[i][1]);
if(!state.contains(load[i][2])) state.add(load[i][2]);
}
Collections.sort(state);
HashMap<Integer,Integer> onload = new HashMap<>();
HashMap<Integer,Integer> download = new HashMap<>();
for(int i=0;i<load.length;i++){
if(onload.containsKey(load[i][1])){
onload.put(load[i][1],onload.get(load[i][1])+load[i][0]);
}else {
onload.put(load[i][1],load[i][0]);
}
if(download.containsKey(load[i][2])){
download.put(load[i][2],download.get(load[i][2])+load[i][0]);
}else {
download.put(load[i][2],load[i][0]);
}
}
int nowCap = capacity;
for(int i=0;i<state.size();i++){
//先卸货
if(download.containsKey(state.get(i))){
nowCap += download.get(state.get(i));
download.remove(state.get(i));
}
//再看能不能装下
if(onload.containsKey(state.get(i))){
if(nowCap<onload.get(state.get(i))){
return false;
}else {
nowCap -= onload.get(state.get(i));
onload.remove(state.get(i));
}
}
}
return true;
}
思路2 类似股票交易
每个站点计算实际增加的重量,如果实际增加重量大于容量则返回false
public static boolean truckGo(int[][] load, int capacity) {
int max = 0;
for (int i = 0; i < load.length; i++) {
max = Math.max(max, load[i][2]);
}
int[] road = new int[max + 1];
for (int i = 0; i < load.length; i++) {
road[load[i][1]] += load[i][0];
road[load[i][2]] -= load[i][0];
}
int loadCapacity = 0;
for (int change : road) {
loadCapacity += change;
if (loadCapacity > capacity) {
return false;
}
}
return true;
}
2.求战场幸存部队(类似括号匹配)
用一个整型数组表示在同一个战场交战的军队,正负表示移动方向,数字绝对值表示战斗指数,正负相撞以后战斗指数低的队伍会团灭,战斗指数高的幸存,输入int[],求幸存的军队。
如 输入[5,10,-5]
输出[5,10]
下面代码通过百分之80
public int[] battle (int[] army) {
Stack<Integer> stack = new Stack<>();
for(int num:army){
if(stack.isEmpty()){
stack.add(num);
}else {
if(num>=0){
stack.push(num);
}else {
while (true){
if(stack.isEmpty()){
stack.add(num);
break;
}
int last = stack.peek();
if(last<0){
break;
}
if(last + num == 0){
stack.pop();
break;
}else if(last + num>0){
break;
}else {
stack.pop();
}
}
}
}
}
int[] result = new int[stack.size()];
for(int i=result.length-1;i>=0;i--){
result[i] = stack.pop();
}
return result;
}