leetCode 编号134和151

5 阅读2分钟

134. 加油站:在一条环路上有 n 个加油站,其中第 i 个加油站有汽油 gas[i] **升。

你有一辆油箱容量无限的的汽车,从第 **i **个加油站开往第 **i+1 **个加油站需要消耗汽油 cost[i] **升。你从其中的一个加油站出发,开始时油箱为空。

给定两个整数数组 gas 和 cost ,如果你可以按顺序绕环路行驶一周,则返回出发时加油站的编号,否则返回 -1 。如果存在解,则 保证 它是 唯一 的。

方法一
思路:
  1. 双层遍历,第一层确定起点加油站,第二层确定是否能走完一圈
  2. 根据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
};
方法二( 原作者题解
思路:
  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中可能会存在前导空格、尾随空格或者单词间的多个空格。返回的结果字符串中,单词间应当仅用单个空格分隔,且不包含任何额外的空格。

思路:
  1. trim去除字符串两边空白
  2. split匹配 正则 规则一个或多个空白符 / +/
  3. 数组反转再拼接
/**
 * @param {string} s
 * @return {string}
 */
var reverseWords = function(s) {
    let newStr = s.trim()
    let newArr = newStr.split(/ +/)
    newArr.reverse()
    return newArr.join(' ')
};