leetCode 编号28、58和121

45 阅读2分钟

28. 找出字符串中第一个匹配项的下标:给你两个字符串 haystack 和 needle ,请你在haystack 字符串中找出 needle 字符串的第一个匹配项的下标(下标从 0 开始)。如果 needle 不是 haystack 的一部分,则返回  -1

/**
 * @param {string} haystack
 * @param {string} needle
 * @return {number}
 */
var strStr = function(haystack, needle) {
    return haystack.indexOf(needle)
};

58. 最后一个单词的长度:给你一个字符串 s,由若干单词组成,单词前后用一些空格字符隔开。返回字符串中 最后一个 单词的长度。单词 是指仅由字母组成、不包含任何空格字符的最大子字符串

/**
 * @param {string} s
 * @return {number}
 */
var lengthOfLastWord = function(s) {
    // 去除两边空格
    let newS = s.trim()
    // 从后网前寻找到最后一个空格索引
    let b = newS.lastIndexOf(' ')
    // 裁剪出最后一个单词返回长度
    return newS.slice(b+1).length
};

121. 买卖股票的最佳时机:给定一个数组 prices ,它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。你只能选择 某一天 买入这只股票,并选择在 未来的某一个不同的日子 卖出该股票。设计一个算法来计算你所能获取的最大利润。返回你可以从这笔交易中获取的最大利润。如果你不能获取任何利润,返回 0(注意你不能在买入前卖出股票)
思路:最大利润,可以理解为(最大值-最小值),但有一个难点就是,这并不是一个有序数组,而且由于不能在买入前卖出股票,所以不能直接sort。思索之后,最开始的想法是两轮遍历,这是最无脑但是也是最耗性能的方法这里不展开,第二种就是使用双指针的方式
        首先我们假设其中的最小最大值的指针为01,默认利润为0,最小指针不动,遍历移动最大指针,遍历时不断以Math.max(result, prices[maxIndex] - minValue)来更新最大利润值,并且根据当前值与最小值的对比,动态更新最小值,这样才能保证(当前值 - 最小值)肯定是最大利润值,具体代码如下:

/**
 * @param {number[]} prices
 * @return {number}
 */
var maxProfit = function (prices) {
    // 设置默认利润为0
    let result = 0
    let len = prices.length
    // 先假设最小值指针为0
    let minValue = prices[0]
    // 不能在买入前卖出股票 所以默认最大值指针为1 遍历数组
    for (var maxIndex = 1; maxIndex < len; maxIndex++) {
       // 取默认值、(最大值 - 最小值)中的最大值重新赋值利润
       result = Math.max(result, prices[maxIndex] - minValue)
       // 如果当前值大于最小值时(最大值 - 最小值)利润最大
       // 如果当前值小于最小值时(最大值 - 最小值)利润并不是最大 所以更新最小值 然后继续遍历
       if(minValue > prices[maxIndex]) {
         minValue = prices[maxIndex]
       }
    }
    return result
};