Skip to content

Commit

Permalink
feat: 1222
Browse files Browse the repository at this point in the history
  • Loading branch information
niaogege committed Dec 22, 2023
1 parent 56fcb5e commit fc24059
Show file tree
Hide file tree
Showing 10 changed files with 613 additions and 14 deletions.
6 changes: 6 additions & 0 deletions docs/interview/experiences/13202307handwriting.md
Original file line number Diff line number Diff line change
Expand Up @@ -690,6 +690,12 @@ thousand('123456789');
var num2 = '123456789.1234';
num2.replace(/(?!^)(?=(\d{3})+\.)/g, ',');
// '123,456,789.1234'

function thousand(str) {
let ans = [];
str = str.split('').reverse();
for (let i = 0; i < str.length; i++) {}
}
```

## 23.实现一个 node 异步函数的 promisify
Expand Down
47 changes: 43 additions & 4 deletions docs/interview/experiences/15202309handwriting.md
Original file line number Diff line number Diff line change
Expand Up @@ -61,12 +61,12 @@ nav:
* 41.增加数组原型 group 方法
* 42.Vue 中的响应式机制是如何实现的?请手写代码来实现数据劫持(数据劫持即数据变化时触发回调函数)的简单示例
* 43.算法:实现一个函数,将给定的十进制数转换为 36 进制表示
* 44.迭代/递归的方式实现二叉树的层次遍历
* 44.useState hook
* 45.判断一个二叉树是否对称,即左子树和右子树是否镜像对称
* 46.给定一组乱序的区间,合并重叠的区间并返回结果。
* 47.多叉树, 获取每一层的节点之和
* 48.
* 49.
* 48.按照版本号由小到大排序
* 49.【代码题】实现一个拼手气抢红包算法
* 50.
*/
```
Expand Down Expand Up @@ -1286,7 +1286,21 @@ console.log(res);

```

## 44.迭代/递归的方式实现二叉树的层次遍历
## 44.useState hook

```js
const useState = (defaultVal) => {
const val = useRef(defaultVal);
const setVal = (newVal) => {
if (typeof newVal === 'function') {
val.current = newVal(val.current);
} else {
val.current = newVal;
}
};
return [val, setVal];
};
```

## 45.判断一个二叉树是否对称,即左子树和右子树是否镜像对称

Expand Down Expand Up @@ -1465,6 +1479,31 @@ var levelOrderDFS = function (root) {
};
```

## 48.按照版本号由小到大排序

```js
// 样例输入:versions = ['0.1.1', '2.3.3', '0.302.1', '4.2', '4.3.5', '4.3.4.5']
// 输出:['0.1.1', '0.302.1', '2.3.3', '4.3.4.5', '4.3.5']
function sortVersion(nums) {
return nums.sort((a, b) => {
a = a.split('.');
b = b.split('.');
let len = Math.max(a.length, b.length);
for (let i = 0; i < len; i++) {
let A = +a[i] || 0;
let B = +b[i] || 0;
if (A == B) continue;
console.log(A - B, 'ab', A, B);
return A - B;
}
return 0;
});
}
sortVersion(['0.1.1', '2.3.3', '0.302.1', '4.2', '4.3.5', '4.3.4.5']);
```

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

## 参考

- [字节跳动前端面经(3 年工作经验附详细答案)](https://mp.weixin.qq.com/s/MYfuUSNS7xIAT4RgZIMv0g)
40 changes: 40 additions & 0 deletions docs/interview/experiences/21leetcodeA.md
Original file line number Diff line number Diff line change
Expand Up @@ -410,6 +410,10 @@ function numIslands(grid) {
## [17.合并两个有序数组](https://leetcode.cn/problems/merge-sorted-array/)

```js
// 输入:nums1 = [1,2,3,0,0,0], m = 3, nums2 = [2,5,6], n = 3
// 输出:[1,2,2,3,5,6]
// 解释:需要合并 [1,2,3] 和 [2,5,6] 。
// 合并结果是 [1,2,2,3,5,6] ,其中斜体加粗标注的为 nums1 中的元素。
function merge(num1, m, num2, n) {
for (let i = m; i < m + n; i++) {
num1[i] = nums2[i - m];
Expand Down Expand Up @@ -512,6 +516,36 @@ function water(nums) {

```

## [33.合并区间](https://leetcode.cn/problems/merge-intervals/)

```js
// 输入:intervals = [[1,3],[2,6],[8,10],[15,18]]
// 输出:[[1,6],[8,10],[15,18]]
// 解释:区间 [1,3] 和 [2,6] 重叠, 将它们合并为 [1,6].
function mergeArr(nums) {
nums.sort((a, b) => a[0] - b[0]);
let ans = [];
let pre = nums[0];
for (let i = 1; i < nums.length; i++) {
let cur = nums[i];
if (cur[0] > pre[1]) {
ans.push(pre);
pre = cur;
} else {
pre[1] = Math.max(cur[1], pre[1]);
}
}
ans.push(pre);
return ans;
}
mergeArr([
[1, 3],
[2, 6],
[8, 10],
[15, 18],
]);
```

## [38.最长公共子序列](https://leetcode.cn/problems/longest-common-subsequence/)

```js
Expand All @@ -537,3 +571,9 @@ function generate(n) {
return res;
}
```

## 50.比较版本号

```js

```
177 changes: 177 additions & 0 deletions docs/interview/experiences/22leetcodeB.md
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,8 @@ nav:
* 22.二叉树的第K小的元素
* 23.将有序数组展开为二叉搜索树
* 24.背包问题
* 25.多个数组交集
* 26.删除有序数组中的重复项
*/
```

Expand Down Expand Up @@ -90,6 +92,46 @@ var pathSum = function (root, targetSum) {

## 3.重排链表

## 4.最长公共前缀

```js
// 输入:strs = ["flower","flow","flight"]
// 输出:"fl"
// 横行扫描
function longFind(strs) {
if (!strs.length) return '';
let prefix = strs[0];
for (let i = 0; i < strs.length; i++) {
prefix = findL(prefix, strs[i]);
if (prefix.length == 0) break;
}
return prefix;
}
function findL(a, b) {
let len = Math.min(a.length, b.length);
let index = 0;
while (a[index] == b[index] && index < len) {
index++;
}
return a.slice(0, index);
}
longFind(['flower', 'flow', 'flight']);
// 纵向扫描
function longFindHor(strs) {
if (!strs.length) return [];
let prefix = strs[0];
for (let i = 0; i < prefix.length; i++) {
for (let j = 1; j < strs.length; j++) {
if (strs[j][i] != prefix[i]) {
return prefix.slice(0, i);
}
}
}
return prefix;
}
longFindHor(['flower', 'flow', 'flight']);
```

## 6.阶乘(迭代/递归/缓存)

```js
Expand Down Expand Up @@ -354,3 +396,138 @@ var diameterOfBinaryTree = function (root) {
return total;
};
```

## 24.背包问题

```js
function weightBag(weight, value, size) {
let len = weight.length;
let dp = new Array(len).fill().map(() => new Array(size + 1).fill(0));
// 首行设置0
for (let i = weight[0]; i <= size; i++) {
dp[0][i] = value[0];
}
// 注意遍历顺序
for (let i = 1; i < len; i++) {
for (let j = 0; j <= size; j++) {
if (weight[i] > j) {
dp[i][j] = dp[i - 1][j];
} else {
dp[i][j] = Math.max(dp[i - 1][j], dp[i - 1][j - weight[i]] + value[i]);
}
}
}
console.table(dp);
return dp[len - 1][size];
}
weightBag([1, 3, 4], [15, 20, 30], 6);
```

## 25.多个数组交集

```js
/**
* 多个数组交集 [[3,1,2,4,5],[1,2,3,4],[3,4,5,6]]
*/
// 横向扫描
function intersect2(nums) {
if (!nums.length) return [];
let prefix = nums[0];
for (let i = 1; i < nums.length; i++) {
prefix = findT(prefix, nums[i]);
if (prefix.length == 0) break;
}
return prefix;
}
function findT(a, b) {
let ans = [];
for (let item of a) {
let index = b.indexOf(item);
if (index > -1) {
ans.push(item);
b.splice(index, 1);
}
}
return ans;
}
intersect2([
[3, 1, 2, 4, 5],
[1, 2, 3, 4],
[3, 4, 5, 6],
]);

// hash
function intersect3(nums) {
let m = new Map();
let ans = [];
for (let item of nums) {
for (let i of item) {
if (!m.has(i)) {
m.set(i, 0);
}
let count = m.get(i);
m.set(i, count + 1);
}
}
for (let [key, value] of m.entries()) {
if (value == nums.length) {
ans.push(key);
}
}
return ans;
}
intersect3([
[3, 1, 2, 4, 5],
[1, 2, 3, 4],
[3, 4, 5, 6],
]);
```

## [26.删除有序数组中的重复项](https://leetcode.cn/problems/remove-duplicates-from-sorted-array/)

```js
// 输入:nums = [0,0,1,1,1,2,2,3,3,4]
// 输出:5, nums = [0,1,2,3,4]
/**
* @param {number[]} nums
* @return {number}
*/
var removeDuplicates = function (nums) {
for (let i = 0; i < nums.length; i++) {
if (nums[i] == nums[i + 1]) {
const v = nums.splice(i, 1);
i--;
}
}
return nums.length;
};
removeDuplicates([1, 1, 2]);
function removeDuplicates2(nums) {
if (nums.length == 0) return 0;
let slow = 0,
fast = 1;
while (fast < nums.length) {
if (nums[fast] != nums[slow]) {
slow = slow + 1;
nums[slow] = nums[fast];
}
fast = fast + 1;
}
return slow + 1;
}
//[1,4,1,6]
function once(nums) {
nums.sort((a. b) => a-b)
let ans = []
for(let i=0;i<nums.length;i++) {
if (nums[i] != nums[i++]) {
ans.push(nums[i++])
} else {
if (ans.length) {
ans.pop()
}
}
}
return ans
}
```
Loading

0 comments on commit fc24059

Please sign in to comment.