feat: leetcode 6,12,15,58,151

This commit is contained in:
LouisFonda 2025-03-29 10:30:38 +08:00
parent 11981edc96
commit 1d8c16c31b
Signed by: yigencong
GPG Key ID: 29CE877CED00E966
5 changed files with 301 additions and 0 deletions

View File

@ -0,0 +1,31 @@
/**
* https://leetcode.cn/problems/integer-to-roman/?envType=study-plan-v2&envId=top-interview-150
* @param {number} num
* @return {string}
*/
const intToRoman = function (num) {
f1(num);
};
const romanMap = [
['', 'I', 'II', 'III', 'IV', 'V', 'VI', 'VII', 'VIII', 'IX'], // 个位
['', 'X', 'XX', 'XXX', 'XL', 'L', 'LX', 'LXX', 'LXXX', 'XC'], // 十位
['', 'C', 'CC', 'CCC', 'CD', 'D', 'DC', 'DCC', 'DCCC', 'CM'], // 百位
['', 'M', 'MM', 'MMM'], // 千位
];
/*
把每一个数位上的数字映射成罗马数字最后拼接即可
*/
function f1(num) {
let result = '';
let place = 0;
while (num > 0) {
result = romanMap[place][num % 10] + result; // 处理当前位的罗马数字
num = Math.floor(num / 10); // 去除当前位
place++; // 处理下一个更高的位
}
return result;
}

View File

@ -0,0 +1,101 @@
/**
* https://leetcode.cn/problems/longest-common-prefix/?envType=study-plan-v2&envId=top-interview-150
* @param {string[]} strs
* @return {string}
*/
const longestCommonPrefix = function (strs) {
};
/*
如果字符串数组长度为0直接返回"",如果长度不为0则以字符数组中的第一个字符为公共前缀来比较遍历整个字符数组如果当前遍历到的字符
串包含整个公共前缀第一个字符串,如果不包含就去掉当前公共前缀的末尾字符继续比较如果在比较的过程中发现公共前缀已经变成了
空字符就直接返回
*/
function f1(strs) {
if (strs.length === 0) return '';
let prefix = strs[0]; // 以字符数组中的第一个字符作为公共前缀
for (let i = 1; i < strs.length; i++) {
while (strs[i].indexOf(prefix) !== 0) { // 如果当前字符不包含公共前缀,说明公共前缀长了,要缩短
prefix = prefix.substring(0, prefix.length - 1); // 缩短前缀
if (prefix === '') return ''; // 没有公共前缀直接返回
}
}
return prefix;
}
/*
思路和上面的一致先比较公共前缀的第一个字符如果字符串数组的所有字符串都满足就比较公共前缀的第二个字符如果发现比较的字符串
长度不够或者当前字符不一致直接返回公共前缀
*/
function f2(strs) {
if (strs.length === 0) return '';
for (let i = 0; i < strs[0].length; i++) {
const char = strs[0][i]; // 获取第一个字符串的当前字符
for (let j = 1; j < strs.length; j++) {
// 如果当前字符与其他字符串的对应位置字符不一致,返回当前公共前缀
if (i >= strs[j].length || strs[j][i] !== char) {
return strs[0].slice(0, i);
}
}
}
return strs[0]; // 如果循环结束,没有不匹配的,说明整个第一个字符串都是公共前缀
}
function f3(strs) {
if (strs.length === 0) return '';
let prefix = strs[0]; // 以第一个字符串作为初始公共前缀
for (let i = 1; i < strs.length; i++) {
let j = 0;
// 逐个字符比较当前公共前缀和下一个字符串
while (j < prefix.length && j < strs[i].length && prefix[j] === strs[i][j]) {
j++;
}
// 更新公共前缀为当前找到的前缀
prefix = prefix.slice(0, j);
// 如果公共前缀为空,直接返回
if (prefix === '') return '';
}
return prefix; // 返回最终的公共前缀
}
// 二分法代码
// TODO
function f4(strs) {
if (strs.length === 0) return ''; // 如果数组为空,直接返回空字符串
// 定义一个递归函数,用于计算区间 [start, end] 的最长公共前缀
function lcp(start, end) {
if (start === end) {
return strs[start]; // 如果区间只包含一个字符串,直接返回
}
// 计算中点,分成两半
const mid = Math.floor((start + end) / 2);
// 递归计算左右两部分的公共前缀
const lcpLeft = lcp(start, mid);
const lcpRight = lcp(mid + 1, end);
// 计算公共前缀的长度
const minLength = Math.min(lcpLeft.length, lcpRight.length);
// 比较两个公共前缀,找到它们的最长公共前缀
for (let i = 0; i < minLength; i++) {
if (lcpLeft[i] !== lcpRight[i]) {
return lcpLeft.slice(0, i); // 返回公共前缀
}
}
return lcpLeft.slice(0, minLength); // 返回较短的前缀
}
return lcp(0, strs.length - 1); // 对整个字符串数组进行递归处理
}

View File

@ -0,0 +1,76 @@
/**
* https://leetcode.cn/problems/reverse-words-in-a-string/?envType=study-plan-v2&envId=top-interview-150
* @param {string} s
* @return {string}
*/
const reverseWords = function (s) {
return f1(s);
};
function f1(s) {
// 去除首尾空格并初始化一个空数组来收集单词
const words = [];
let currentWord = '';
// 遍历字符串
for (let i = 0; i < s.length; i++) {
const char = s[i];
if (char !== ' ') {
// 当前字符不是空格拼接到currentWord
currentWord += char;
} else if (currentWord !== '') {
// 当前字符是空格且currentWord非空说明找到一个单词push到words数组
words.push(currentWord);
currentWord = ''; // 重置currentWord
}
}
// 如果最后一个字符不是空格,可能会有一个单词没有被加进去
if (currentWord !== '') {
words.push(currentWord);
}
// 反转单词数组并用单空格连接返回
return words.reverse().join(' ');
}
/*
技巧项的方式直接用正则匹配空格字符分割成想的单词字符串数组之后反转数组再拼
*/
function f2(s) {
const reverseWords = function (s) {
// 去除多余的空格并按空格分割为单词
const words = s.trim().split(/\s+/); // 使用正则去掉多余空格
// 反转单词数组并用单空格连接
return words.reverse().join(' ');
};
}
/*
利用栈首先对字符串s做trim处理,之后遍历整个字符串如果当前字符不等于" "直接压入栈中如果当前字符是" "检查栈顶元素是否是
" ",如果栈顶元素是空就跳过否则就压入栈中
*/
function f3(s) {
const stack = []; // js的数组由栈的特性直接使用即可
let isPrevSpace = true; // 标记栈顶元素js数组没有提供peek方法
s = s.trim();
for (let i = 0; i < s.length; i++) {
if (s[i] !== ' ') {
stack.push(s[i]);
isPrevSpace = false;
} else if (!isPrevSpace) {
stack.push(s[i]);
isPrevSpace = true;
}
}
// 最后通过栈弹出并拼接成结果,
// return stack.reverse().join('');
let res = '';
while (stack.length >= 0) {
res += stack.pop();
}
return res;
}

View File

@ -0,0 +1,42 @@
/**
* https://leetcode.cn/problems/length-of-last-word/?envType=study-plan-v2&envId=top-interview-150
* @param {string} s
* @return {number}
*/
const lengthOfLastWord = function (s) {
return f1(s);
};
/*
使用trim对字符做前后空格处理之后使用split(" ")分割最后返回split(" ")[s.length = 1].length
*/
function f1(s) {
// 去除首尾空格,并按空格分割字符串
const words = s.trim().split(' ');
// 返回最后一个单词的长度
return words[words.length - 1].length;
}
/*
方法2从后往前遍历按照题目的要求所给的测试用例至少会包含一个单词直接从和往前遍历先去除末尾空格如果是空格就跳过
直到遇到不是空格的情况之后再遍历这个末尾单词如果不是空格就在统计的长度上加1直到遇到这个单词前面的空格结束循环表示
单词统计完成
*/
function f2(s) {
let len = 0; // 统计末尾单词长度
let i = s.length - 1; // 有效字符的位置
// 去除末尾空格
while (i >= 0 && s[i] === ' ') {
i--;
}
// 统计末尾字符长度
while (i >= 0 && s[i] !== ' ') {
len++;
i--;
}
return len;
}

View File

@ -0,0 +1,51 @@
/**
* https://leetcode.cn/problems/zigzag-conversion/?envType=study-plan-v2&envId=top-interview-150
* @param {string} s
* @param {number} numRows
* @return {string}
*/
const convert = function (s, numRows) {
};
/*
思路2. 设计抽象模型
建立一个 rows 数组长度为 numRows用于存储每一行的字符
使用变量 index 记录当前行号
使用变量 direction 记录移动方向向下 +1向上 -1
初始 direction = 1向下
到达最后一行时direction = -1向上
到达第一行时direction = 1向下
遍历字符串 s依次将字符添加到 rows[index]并更新 index
最后合并 rows 数组得到最终的字符串
*/
function f1(s, numRows) {
if (numRows === 1 || numRows >= s.length) return s;
const rows = Array.from({ length: numRows }, () => []);
let index = 0; let
direction = 1;
for (const char of s) {
rows[index].push(char);
if (index === 0) direction = 1;
if (index === numRows - 1) direction = -1;
index += direction;
}
return rows.flat().join('');
}
/*
周期的方式编写
*/
function f2(s, numRows) {
}