【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 题解
解题思路:
我们可以将字符串数组中的第一个字符串作为基准字符串,然后逐个比较每个字符串的前缀是否与基准字符串相同,如果不同则缩短基准字符串的长度,一直到找到公共前缀为止。
具体实现步骤如下:
- 判断输入的字符串数组是否为空或长度是否为0,若是则返回空字符串。
- 将字符串数组中的第一个字符串赋值给一个变量 prefix。
- 遍历字符串数组中的每个字符串,比较该字符串与 prefix 的公共前缀,如果不匹配,则将 prefix 的长度缩短,继续比较,直到找到公共前缀或 prefix 变为空字符串。
- 返回 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;
}
}
三、面试经典 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 题解
解题思路:
可以使用一个变量来跟踪当前剩余的油量,以及另一个变量来跟踪从起始加油站到当前加油站的总油量差值。具体步骤如下:
- 初始化两个变量:start 表示起始加油站的索引,total 表示累计的油量与消耗量之差。
- 初始化 currGas 和 totalGas 为 0。
- 遍历加油站数组 gas 和消耗数组 cost,对于每个加油站 i:
- 将 currGas 加上 gas[i] - cost[i],表示到达该加油站后剩余的油量与消耗量之差。
- 将 totalGas 加上 gas[i] - cost[i],表示从起始加油站到当前加油站的总油量差值。
- 如果 currGas 小于 0,则将 start 设为下一个加油站的索引,并将 currGas 清零。
- 遍历结束后,判断 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;
}
}
}
至此,挑战100天 AI In LeetCode Day12(热题+面试经典150题)完成,后续会持续调整;查阅过程中若遇到问题欢迎留言或私信交流。