百度笔试汽车加油问题

每段的过程都有相似性,用递归可以实现

public class MinGasStation {

    public static int minGasStation(int numOfGS, int[] distOfGS,
                             int[] allowedGasoline, int distance,
                             int initialGasoline) {
        //汽车跑不到加油站的情况
        //途中没有加油站的情况
        if(distOfGS==null){
            if(initialGasoline < distance){
                return -1;
            }else{
                return 0;
            }
        }
        //途中有加油站的情况
        if(initialGasoline>= distance){//汽车直接跑到终点不用加油
            return 0;
        }
        if(initialGasoline<distOfGS[0]){//汽车跑不到加油站
            return -1;
        }

        //当汽车跑到第一个加油站位置时
        int curnumofGS = numOfGS-1;
        //当前位置剩余加油站到当前加油站的距离
        int[] curdistOfGS = null;
        if(distOfGS.length>1){
            curdistOfGS = new int[distOfGS.length-1];
            for(int i = 1;i<distOfGS.length;i++){
                curdistOfGS[i-1] = distOfGS[i]-distOfGS[0];
            }
        }
        //当前剩余每个加油站可供汽油量的列表
        int[] curallowedGasoline = null;
        if(allowedGasoline.length>1){
            curallowedGasoline = new int[allowedGasoline.length-1];
            for(int i = 1;i<allowedGasoline.length;i++){
                curallowedGasoline[i-1] = allowedGasoline[i];
            }
        }
        //当前距离办公室的距离
        int curdistance = distance-distOfGS[0];
        //当前汽车中存汽油的初始值
        int curinitialGasoline = initialGasoline- distOfGS[0];

        //从当前加油站出发到终点需要停留的次数
        
        //当前加油站停留加油
        int addgas = minGasStation(curnumofGS,curdistOfGS,curallowedGasoline,curdistance,curinitialGasoline+allowedGasoline[0])+1;
        //当前加油站不停留
        int noaddgas = minGasStation(curnumofGS,curdistOfGS,curallowedGasoline,curdistance,curinitialGasoline);
        
     
        if(addgas != 0 && noaddgas!=-1){
            return addgas<noaddgas?addgas:noaddgas;
        }else if(addgas == 0 && noaddgas!=-1){
            return noaddgas;
        }else if(addgas!=0 && noaddgas== -1){
            return addgas;
        }else{
            return -1;
        }
    }

    public static void main(String[] args) {
        int numOfGS = 4;
        int[] distOfGS = {5,7,8,10};
        int[] allowedGasoline = {2,3,1,5};
        int distance = 15;
        int initialGasoline = 5;

        System.out.println(minGasStation(numOfGS,distOfGS,allowedGasoline,distance,initialGasoline));
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值