134. 加油站:在一条环路上有 n
个加油站,其中第 i
个加油站有汽油 gas[i]
**升。
你有一辆油箱容量无限的的汽车,从第 **i
**个加油站开往第 **i+1
**个加油站需要消耗汽油 cost[i]
**升。你从其中的一个加油站出发,开始时油箱为空。
给定两个整数数组 gas
和 cost
,如果你可以按顺序绕环路行驶一周,则返回出发时加油站的编号,否则返回 -1
。如果存在解,则 保证 它是 唯一 的。
方法一
思路:
- 双层遍历,第一层确定起点加油站,第二层确定是否能走完一圈
- 根据
gas
能加的油的 总和 与cost
需要消耗的油的 总和 对比,加的油比耗的多,继续往下直到跑完一圈,返回i
值,否则break
第二层循环,并赋值i = i + j
重新开始第一层循环,因为每次从新的索引开始的第一个 加油 - 油耗 肯定是位 正数 的,不够的情况再砍掉一个 正数,结果肯定是更加的不够
/**
* @param {number[]} gas
* @param {number[]} cost
* @return {number}
*/
var canCompleteCircuit = function (gas, cost) {
let len = gas.length
for (let i = 0; i < len; i++) {
if (gas[i] >= cost[i]) {
let resultGas = 0
let resultCost = 0
for (let j = 0; j < len; j++) {
let a = (i + j) % len
resultGas = resultGas + gas[a]
resultCost = resultCost + cost[a]
if(resultGas < resultCost) {
i = i + j
break
} else {
if(j == len - 1) {
return i
}
}
}
}
}
return -1
};
方法二( 原作者题解 )
思路:
- 一次循环,以 加油 - 油耗 的值的 和,当 小于
0
时,清零 重新开始。完成所有循环后,总结果为零,则返回-1
,否则返回 起始索引
/**
* @param {number[]} gas
* @param {number[]} cost
* @return {number}
*/
var canCompleteCircuit = function(gas, cost) {
const gasLen = gas.length
let start = 0
let curSum = 0
let totalSum = 0
for(let i = 0; i < gasLen; i++) {
curSum += gas[i] - cost[i]
totalSum += gas[i] - cost[i]
if(curSum < 0) {
curSum = 0
start = i + 1
}
}
if(totalSum < 0) return -1
return start
};
151. 反转字符串中的单词:给你一个字符串 s
,请你反转字符串中 单词 的顺序。
单词 是由非空格字符组成的字符串。s
中使用至少一个空格将字符串中的 单词 分隔开。
返回 单词 顺序颠倒且 单词 之间用单个空格连接的结果字符串。
注意: 输入字符串 s
中可能会存在前导空格、尾随空格或者单词间的多个空格。返回的结果字符串中,单词间应当仅用单个空格分隔,且不包含任何额外的空格。
思路:
trim
去除字符串两边空白split
匹配 正则 规则一个或多个空白符/ +/
- 数组反转再拼接
/**
* @param {string} s
* @return {string}
*/
var reverseWords = function(s) {
let newStr = s.trim()
let newArr = newStr.split(/ +/)
newArr.reverse()
return newArr.join(' ')
};