【LeetCode】挑战100天 Day12(热题+面试经典150题)

【LeetCode】挑战100天 Day12(热题+面试经典150题)

  • 一、LeetCode介绍
  • 二、LeetCode 热题 HOT 100-14
    • 2.1 题目
    • 2.2 题解
  • 三、面试经典 150 题-14
    • 3.1 题目
    • 3.2 题解

一、LeetCode介绍

在这里插入图片描述
LeetCode是一个在线编程网站,提供各种算法和数据结构的题目,面向程序员、计算机科学专业学生和技术爱好者等人群,旨在帮助他们提高算法和编程技能。LeetCode上的问题通常来自各种技术公司的面试题目,因此它也是程序员面试准备的重要资源之一。

LeetCode上的问题涵盖了各种难度级别,从入门级到专家级都有不同难度的题目可供练习。用户可以选择使用不同的编程语言提交答案,LeetCode能够对结果进行评估并返回测试结果。

除了题目外,LeetCode还提供了讨论区、排行榜等社区功能,用户可以在这里交流学习心得、解决疑难问题,并与其他用户比较自己的做题成绩。

挑战100天 AI In LeetCode是基于LeetCode题库,借助AI的能力进行解题、并学习其解题过程。

二、LeetCode 热题 HOT 100-14

2.1 题目

最长公共前缀

编写一个函数来查找字符串数组中的最长公共前缀。

如果不存在公共前缀,返回空字符串 ""。

 

示例 1:

输入:strs = ["flower","flow","flight"]
输出:"fl"
示例 2:

输入:strs = ["dog","racecar","car"]
输出:""
解释:输入不存在公共前缀。
 

提示:

1 <= strs.length <= 200
0 <= strs[i].length <= 200
strs[i] 仅由小写英文字母组成

2.2 题解

解题思路:

我们可以将字符串数组中的第一个字符串作为基准字符串,然后逐个比较每个字符串的前缀是否与基准字符串相同,如果不同则缩短基准字符串的长度,一直到找到公共前缀为止。

具体实现步骤如下:

  1. 判断输入的字符串数组是否为空或长度是否为0,若是则返回空字符串。
  2. 将字符串数组中的第一个字符串赋值给一个变量 prefix。
  3. 遍历字符串数组中的每个字符串,比较该字符串与 prefix 的公共前缀,如果不匹配,则将 prefix 的长度缩短,继续比较,直到找到公共前缀或 prefix 变为空字符串。
  4. 返回 prefix。
public class Solution {
    public String longestCommonPrefix(String[] strs) {
        if (strs == null || strs.length == 0) {
            return "";
        }
        String prefix = strs[0];
        for (int i = 1; i < strs.length; i++) {
            while (strs[i].indexOf(prefix) != 0) {
                prefix = prefix.substring(0, prefix.length() - 1);
                if (prefix.isEmpty()) {
                    return "";
                }
            }
        }
        return prefix;
    }
}

【LeetCode】挑战100天 Day12(热题+面试经典150题)_第1张图片

三、面试经典 150 题-14

数组 / 字符串

3.1 题目

加油站

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

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

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

 

示例 1:

输入: gas = [1,2,3,4,5], cost = [3,4,5,1,2]
输出: 3
解释:3 号加油站(索引为 3)出发,可获得 4 升汽油。此时油箱有 = 0 + 4 = 4 升汽油
开往 4 号加油站,此时油箱有 4 - 1 + 5 = 8 升汽油
开往 0 号加油站,此时油箱有 8 - 2 + 1 = 7 升汽油
开往 1 号加油站,此时油箱有 7 - 3 + 2 = 6 升汽油
开往 2 号加油站,此时油箱有 6 - 4 + 3 = 5 升汽油
开往 3 号加油站,你需要消耗 5 升汽油,正好足够你返回到 3 号加油站。
因此,3 可为起始索引。
示例 2:

输入: gas = [2,3,4], cost = [3,4,3]
输出: -1
解释:
你不能从 0 号或 1 号加油站出发,因为没有足够的汽油可以让你行驶到下一个加油站。
我们从 2 号加油站出发,可以获得 4 升汽油。 此时油箱有 = 0 + 4 = 4 升汽油
开往 0 号加油站,此时油箱有 4 - 3 + 2 = 3 升汽油
开往 1 号加油站,此时油箱有 3 - 3 + 3 = 3 升汽油
你无法返回 2 号加油站,因为返程需要消耗 4 升汽油,但是你的油箱只有 3 升汽油。
因此,无论怎样,你都不可能绕环路行驶一周。
 

提示:

gas.length == n
cost.length == n
1 <= n <= 105
0 <= gas[i], cost[i] <= 104

3.2 题解

解题思路:

可以使用一个变量来跟踪当前剩余的油量,以及另一个变量来跟踪从起始加油站到当前加油站的总油量差值。具体步骤如下:

  1. 初始化两个变量:start 表示起始加油站的索引,total 表示累计的油量与消耗量之差。
  2. 初始化 currGas 和 totalGas 为 0。
  3. 遍历加油站数组 gas 和消耗数组 cost,对于每个加油站 i:
    • 将 currGas 加上 gas[i] - cost[i],表示到达该加油站后剩余的油量与消耗量之差。
    • 将 totalGas 加上 gas[i] - cost[i],表示从起始加油站到当前加油站的总油量差值。
    • 如果 currGas 小于 0,则将 start 设为下一个加油站的索引,并将 currGas 清零。
  4. 遍历结束后,判断 totalGas 的值是否小于 0,如果是则返回 -1,否则返回 start。
public class Solution {
    public int canCompleteCircuit(int[] gas, int[] cost) {
        int start = 0; // 起始加油站的索引
        int currGas = 0; // 当前剩余的油量
        int totalGas = 0; // 从起始加油站到当前加油站的总油量差值

        for (int i = 0; i < gas.length; i++) {
            currGas += gas[i] - cost[i];
            totalGas += gas[i] - cost[i];

            if (currGas < 0) {
                start = i + 1;
                currGas = 0;
            }
        }

        // 判断是否可以绕环路行驶一周
        if (totalGas < 0) {
            return -1;
        } else {
            return start;
        }
    }
}

【LeetCode】挑战100天 Day12(热题+面试经典150题)_第2张图片

至此,挑战100天 AI In LeetCode Day12(热题+面试经典150题)完成,后续会持续调整;查阅过程中若遇到问题欢迎留言或私信交流。

你可能感兴趣的:(LeetCode,leetcode,算法,java)