笔试题记录
# 第1题:不定长二维数组的全排列
给定任意二维数组,输出所有的排列组合项 比如 [['A','B'], ['a','b'], [1, 2]],输出 ['Aa1','Aa2','Ab1','Ab2','Ba1','Ba2','Bb1','Bb2']
const comput = (que: any[]) => {
//获取第一个数组
let res = que[0];
// 采用动态规划的方式
for (let i = 1; i < que.length; i++) {
const pre = res;
res = [];
//将第一个数组与第二个数组结合
pre.forEach((item: any) => {
que[i].forEach((curr: any) => {
res.push(item + curr);
});
});
// 得到的答案再遍历
}
return res;
};
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 第2题:两个字符串的删除操作
每步 可以删除任意一个字符串中的一个字符。
示例 1: 输入: word1 = "sea", word2 = "eat" 输出: 2 解释: 第一步将 "sea" 变为 "ea" ,第二步将 "eat "变为 "ea"
示例 2: 输入: word1 = "leetcode", word2 = "etco" 输出: 4
提示: 1 <= word1.length, word2.length <= 500 word1 和 word2 只包含小写英文字母
/**
* @param {string} word1
* @param {string} word2
* @return {number}
*/
const minDistance = (word1, word2) => {
let len1 = word1.length,
len2 = word2.length;
let dp = Array(len1 + 1)
.fill(0)
.map(() => Array(len2 + 1).fill(Infinity));
for (let i = 0; i <= len1; i++) {
dp[i][0] = i;
}
for (let j = 0; j <= len2; j++) {
dp[0][j] = j;
}
for (let i = 1; i <= len1; i++) {
for (let j = 1; j <= len2; j++) {
if (word1[i - 1] === word2[j - 1]) {
dp[i][j] = dp[i - 1][j - 1];
} else {
dp[i][j] = Math.min(dp[i - 1][j] + 1, dp[i][j - 1] + 1, dp[i - 1][j - 1] + 2);
}
}
}
return dp[len1][len2];
};
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
# 第3题:最大数
给定一组非负整数 nums,重新排列每个数的顺序(每个数不可拆分)使之组成一个最大的整数。
示例 1: 输入:nums = [10,2] 输出:"210"
示例 2: 输入:nums = [3,30,34,5,9] 输出:"9534330"
function largestNumber(nums) {
nums.sort((x, y) => {
let sx = 10, sy = 10;
while (sx <= x) {
sx *= 10;
}
while (sy <= y) {
sy *= 10;
}
return (sx * y + x) - ((sy * x + y));
})
if (nums[0] === 0) {
return '0';
}
return nums.join('');
};
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
编辑 (opens new window)
上次更新: 2023/05/24, 18:14:42