开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第2天,点击查看活动详情
题目
在一条环路上有
n个加油站,其中第i个加油站有汽油gas[i]升。
你有一辆油箱容量无限的的汽车,从第
i个加油站开往第i+1个加油站需要消耗汽油cost[i]升。你从其中的一个加油站出发,开始时油箱为空。
给定两个整数数组
gas和cost,如果你可以绕环路行驶一周,则返回出发时加油站的编号,否则返回-1。如果存在解,则 保证 它是 唯一 的。
输入: gas = [1,2,3,4,5], cost = [3,4,5,1,2]
输出: 3
思路
我们先声明一个gascost数组用于记录形参gas和形参cost的值,由于形参gas和形参cost形参长度都一样,所以我们这里进行循环形参gas的值,将形参gas和形参cost的每一项都使用push方法添加到gascost数组中,将两个数组进行合并到gascost数组,在声明一个shifttime变量,他的值默认是形参gas的长度,在声明一个res变量用于存放最后的结果,存储的是下标,默认为0,然后进行循环,循环条件为只要shifttime变量值存在则一直循环,在循环中我们声明一个allgas变量,默认值为0,然后在进行循环gascost数组,默认循环变量j为0,每次循环j都+2,在循环中allgas变量于gascost数组当前项和当前的项的后一位相减后的数进行相加并重新赋值给allgas变量,在判断当前的allgas变量是否小于0,如果小于0则立即跳出循环,如果不小于0则进行下一轮循环,循环结束后,我们在判断当前allgas变量是否大于或者等于0,如果是则将当前形参gas的数据长度减去shifttime变量赋值给res变量后退出循环,接下来我们在声明两个变量,分别为tempgas变量和tempcost变量,他们分别是gascost数组中的第一位和第二位的值,然后在使用push方法将tempgas变量和tempcost变量变量添加到gascost数组的末尾,在将shifttime变量自减1,最后如果res存在则返回res,否则就将-1返回出去
var canCompleteCircuit = function (gas, cost) {
let gascost = []
for (let i = 0; i < gas.length; i++) {
gascost.push(gas[i])
gascost.push(cost[i])
}
let shifttime = gas.length
let res=0;
while (!!shifttime) {
let allgas = 0
for (let j = 0; j < gascost.length; j = j + 2) {
allgas = allgas +(gascost[j] - gascost[j + 1])
if (allgas < 0) {
break
}
}
if (allgas >= 0) {
res = gas.length - shifttime
break
}
let tempgas = gascost.shift()
let tempcost = gascost.shift()
gascost.push(tempgas)
gascost.push(tempcost)
shifttime--
}
return res || -1
};