Skip to content

Commit

Permalink
feat: 1226
Browse files Browse the repository at this point in the history
  • Loading branch information
niaogege committed Dec 27, 2023
1 parent de0f875 commit 1a85dc6
Show file tree
Hide file tree
Showing 7 changed files with 336 additions and 2 deletions.
2 changes: 1 addition & 1 deletion docs/interview/experiences/13202307handwriting.md
Original file line number Diff line number Diff line change
Expand Up @@ -1080,7 +1080,7 @@ async function pool(array, limit, iteratorFn) {
var p2 = p1.then(() => arr.splice(arr.indexOf(p2), 1));
// 保存正在执行的异步任务
arr.push(p2);
if (arr.length >= arr) {
if (arr.length >= limit) {
// 等待较快的任务执行
await Promise.race(arr);
}
Expand Down
76 changes: 76 additions & 0 deletions docs/interview/experiences/15202309handwriting.md
Original file line number Diff line number Diff line change
Expand Up @@ -1109,7 +1109,38 @@ getRandom(-3, -1);
## 33.实现阶乘(迭代/递归)

```js
// dfs 1*2*3
function count(n) {
if (n <= 0) return 0;
if (n == 1) return n;
return n * count(n - 1);
}
count(3);

// bfs
function count(n) {
if (n <= 0) return 0;
if (n == 1) return n;
let ans = 1;
for (let i = 2; i <= n; i++) {
ans = ans * i;
}
return ans;
}
count(3);
// 带有缓存
function factorial(n) {
let m = new Map();
let fn = (n) => {
if (n <= 1) return 1;
if (m.has(n)) return m.get(n);
let res = n * fn(n - 1);
m.set(n, res);
return res;
};
return fn(n);
}
factorial(4);
```

## 34.FileReader 使用
Expand Down Expand Up @@ -1209,6 +1240,48 @@ pre = 'abcde123';
now = '1abc123';

// a前面插入了1, c后面删除了de
// 删除动作和添加动作
// 添加 位置和内容
// 删除 位置和内容
function diff(pre, now) {
now = now.split('');
let action = {
delete: [],
add: [],
};
let base = pre.split('');
let i = 0;
let j = 0;
while (i < base.length && j < now.length) {
if (base[i] == now[j]) {
if (j > i) {
action.add.push({
cont: now.splice(i, j - i),
index: base[i],
});
j = i;
} else if (j < i && j >= 1) {
action.delete.push({
cont: base.splice(j, i - j),
index: now[j - 1],
});
i = j;
}
i = i + 1;
j = j + 1;
} else if (base[i] != now[j]) {
let index = now.indexOf(base[i]);
if (index < 0) {
i++;
} else {
j++;
}
}
}
console.log(action, 'action');
return action;
}
diff('abcde123', '1abc123');
```

## 38.给一个字符串, 找到第一个不重复的字符
Expand Down Expand Up @@ -1300,6 +1373,7 @@ const useState = (defaultVal) => {
};
return [val, setVal];
};
export default useState;
```

## 45.判断一个二叉树是否对称,即左子树和右子树是否镜像对称
Expand Down Expand Up @@ -1504,6 +1578,8 @@ sortVersion(['0.1.1', '2.3.3', '0.302.1', '4.2', '4.3.5', '4.3.4.5']);

## 49.【代码题】实现一个拼手气抢红包算法

## 50.

## 参考

- [字节跳动前端面经(3 年工作经验附详细答案)](https://mp.weixin.qq.com/s/MYfuUSNS7xIAT4RgZIMv0g)
32 changes: 31 additions & 1 deletion docs/interview/experiences/22leetcodeB.md
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ nav:
* 5.最长公共子序列
* 6.阶乘(迭代/递归/缓存)
* 7.打家劫舍
* 8.零钱兑换
* 8.零钱兑换I/零钱兑换II
* 9.删除链表的节点
* 10.括号生成
* 11.数组旋转
Expand All @@ -48,6 +48,7 @@ nav:
* 24.背包问题
* 25.多个数组交集
* 26.删除有序数组中的重复项
* 27.不定长二维数组全排列
*/
```

Expand Down Expand Up @@ -531,3 +532,32 @@ function once(nums) {
return ans
}
```

## 27.不定长二维数组全排列

```js
// [['A', 'B'],[1, 2],['a', 'b']]
function allPer(nums) {
let ans = [];
let backTrack = (nums, path, row) => {
if (nums.length === path.length) {
ans.push(path.slice().join(''));
return;
}
for (let i = 0; i < nums[row].length; i++) {
path.push(nums[row][i]);
backTrack(nums, path, row + 1);
path.pop();
}
};
backTrack(nums, [], 0);
return ans;
}
allPer([
['A', 'B'],
[1, 2],
['a', 'b'],
]);
```

## 28.
2 changes: 2 additions & 0 deletions docs/interview/experiences/practise/202312/1224.js
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,8 @@
* 5.完全二叉树的节点个数
*/

// 1和0

// 目标和
// 如何转化背包问题 容量和物品
/**
Expand Down
154 changes: 154 additions & 0 deletions docs/interview/experiences/practise/202312/1226.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,154 @@
/**
* 1.limitQuest
* 2.背包问题 滚动数组
* 3.比较版本号
* 4.岛屿数量
* 5.目标和
* 6.1和0
*/

var changeOne = function (amount, coins) {
let len = coins.length;
let dp = new Array(amount + 1).fill(0);
dp[0] = 1;
for (let i = 0; i < len; i++) {
for (let j = coins[i]; j <= amount; j++) {
dp[j] += dp[j - coins[i]];
}
}
return dp[amount];
};
var change = function (amount, coins) {
let len = coins.length;
let dp = new Array(len).fill().map(() => new Array(amount + 1).fill(0));
for (let i = 0; i <= amount; i += coins[0]) {
dp[0][i] = 1;
}
for (let i = 1; i < len; i++) {
for (let j = 0; j <= amount; j++) {
for (let k = 0; k * coins[i] <= j; k++) {
dp[i][j] += dp[i - 1][j - k * coins[i]];
}
}
}
return dp[len - 1][amount];
};

/**
*
给你一个非负整数数组 nums 和一个整数 target 。
向数组中的每个整数前添加 '+' 或 '-' ,然后串联起所有整数,可以构造一个 表达式 :
例如,nums = [2, 1] ,可以在 2 之前添加 '+' ,在 1 之前添加 '-' ,然后串联起来得到表达式 "+2-1" 。
返回可以通过上述方法构造的、运算结果等于 target 的不同 表达式 的数目。
*/
// 目标和
// 背包问题解决太牵强
var findTargetSumWays = function (nums, target) {
// 如何转化为背包问题
let sum = nums.reduce((a, b) => a + b);
// 此时没有方案
if (target > sum || (sum + target) % 2 == 1) return 0;
let bagSize = (sum + target) / 2;
let dp = new Array(bagSize + 1).fill(0);
dp[0] = 1;
for (let i = 0; i < nums.length; i++) {
for (let j = bagSize; j >= nums[i]; j--) {
dp[j] += dp[j - nums[i]];
}
}
return dp[bagSize];
};

/**
* 判断岛屿数量
* @param grid char字符型二维数组
* @return int整型
*/
function solve(grid) {
// write code here
let count = 0;
let r = grid.length - 1;
let c = grid[0].length - 1;
for (let i = 0; i <= r; i++) {
for (let j = 0; j <= c; j++) {
if (grid[i][j] === '1') {
dfs(grid, i, j);
count = count + 1;
}
}
}
let isValid = (grid, r, c) => {
return r >= 0 && r < grid.length && c < grid[0].length && c >= 0;
};
let dfs = (grid, r, c) => {
if (!isValid(grid, r, c) || grid[r][c] != '1') {
return;
}
grid[r][c] = '2';
dfs(grid, r - 1, c);
dfs(grid, r + 1, c);
dfs(grid, r, c - 1);
dfs(grid, r, c + 1);
};
return count;
}

/**
"1.1","2.1" -1
"2.0.1","2" 1
"1.1","1.01" 0
"1.0.1","1"
* 比较版本号
* @param version1 string字符串
* @param version2 string字符串
* @return int整型
*/
function compare(v1, v2) {
v1 = v1.split('.').map((e) => +e);
v2 = v2.split('.').map((e) => +e);
let len = Math.max(v1.length, v2.length);
let i = 0;
while (i < len) {
let cu1 = v1[i] || 0;
let cu2 = v2[i] || 0;
if (cu1 > cu2) {
return 1;
} else if (cu1 < cu2) {
return -1;
} else {
i++;
}
}
return 0;
}

function weightBagOne(weight, value, size) {
let len = weight;
var dp = new Array(size + 1).fill(0);
for (let i = 0; i < len; i++) {
for (let j = size; j >= 0; j--) {
dp[j] = Math.max(dp[j], dp[j - weight[i]] + value[i]);
}
}
return dp[size];
}

async function limitQuest(arr, limit, fn) {
let queue = [];
let res = [];
for (let i = 0; i < arr.length; i++) {
let p1 = Promise.resolve(arr[i]).then(() => fn());
res.push(p1);
if (arr.length >= limit) {
// 当任务完成后,从正在执行的任务数组中移除已完成的任务
let p2 = p1.then(() => {
return queue.splice(queue.indexOf(p2), 1);
});
queue.push(p2);
if (queue.length >= limit) {
await Promise.race(queue);
}
}
}
return Promise.all(res);
}
65 changes: 65 additions & 0 deletions docs/interview/experiences/practise/202312/1227.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,65 @@
/**
* 1.零钱兑换II
* 2.不定长的二维数组全排列
* 3.
* 4.
*/

// 假设你正在爬楼梯。需要 n 阶你才能到达楼顶。
// 每次你可以爬至多m (1 <= m < n)个台阶。你有多少种不同的方法可以爬到楼顶呢?
// 注意:给定 n 是一个正整数。

// dp[j]:凑足总额为j所需钱币的最少个数为dp[j]
function coinChange(coins, amount) {
let dp = new Array(amount + 1).fill(Infinity);
dp[0] = 0;
for (let coin of coins) {
for (let j = coin; j <= amount; j++) {
dp[j] = Math.min(dp[j], dp[j - coin] + 1);
}
}
return dp[amount] == Infinity ? '-1' : dp[amount];
}

function per(nums) {
let ans = [];
let backTrack = (nums, path) => {
if (nums.length == path.length) {
ans.push(path.slice());
return;
}
for (let i = 0; i < nums.length; i++) {
let cur = nums[i];
if (!path.includes(cur)) {
path.push(cur);
backTrack(nums, path);
path.pop();
}
}
};
backTrack(nums, []);
return ans;
}
per(['1', '2', '3']);
//
function allPer(nums) {
let ans = [];
let backTrack = (arr, path, row) => {
if (path.length === arr.length) {
ans.push(path.slice().join(''));
return;
}
for (let i = 0; i < arr[row].length; i++) {
path.push(arr[row][i]);
backTrack(arr, path, row + 1);
path.pop();
}
};
backTrack(nums, [], 0);
return ans;
}
allPer([
['A', 'B'],
[1, 2],
['a', 'b'],
]);
Loading

0 comments on commit 1a85dc6

Please sign in to comment.