lazada2021秋招笔试

这篇博客介绍了两个编程挑战。第一个挑战是货车司机的单向装卸货问题,类似于股票交易,需要根据货车的载重量和货运清单判断是否能成功完成所有订单。第二个挑战是战场幸存部队问题,给定一个表示军队交战的整数数组,计算幸存的军队。博客提供了两种解决方案,并给出了部分代码实现。
摘要由CSDN通过智能技术生成

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;
    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值