Skip to content

Commit 4d72e9e

Browse files
committed
fix: --
1 parent 58bfa26 commit 4d72e9e

17 files changed

+650
-0
lines changed

js-code/code/合并区间.js

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
// s1 s2 s1[1] >= s2[0]
2+
// current next
3+
/**
4+
* @param {number[][]} intervals
5+
* @return {number[][]}
6+
56. 合并区间
7+
*/
8+
var merge = function(intervals) {
9+
let ans = []
10+
let len = intervals.length
11+
let index = 0
12+
let current = []
13+
intervals.sort((prev, next) => prev[0] - next[0])
14+
while(index < len) {
15+
next = intervals[index++]
16+
if (current.length === 0) {
17+
current = next
18+
} else {
19+
if(current[1] >= next[0]) {
20+
current = [current[0], Math.max(current[1], next[1])]
21+
}else{
22+
ans.push([...current])
23+
current = next
24+
}
25+
}
26+
}
27+
if(current.length > 0) {
28+
ans.push([...current])
29+
}
30+
return ans
31+
};

js-code/code/字符串相加 .js

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
/**
2+
* @param {string} num1
3+
* @param {string} num2
4+
* @return {string}
5+
415.字符串相加
6+
*/
7+
var addStrings = function(num1, num2) {
8+
let len1 = num1.length
9+
let len2 = num2.length
10+
let i = len1 - 1
11+
let j = len2 - 1
12+
let carry = 0
13+
let ans = ''
14+
while(i>=0 || j>=0) {
15+
let cur1 = i < 0 ? 0 : num1[i] * 1
16+
let cur2 = j < 0 ? 0 : num2[j] * 1
17+
let {result, nextcarry} = add (cur1, cur2, carry)
18+
carry = nextcarry
19+
ans = result + ans
20+
i--
21+
j--
22+
}
23+
if(carry!==0) {
24+
ans = carry + ans
25+
}
26+
return ans
27+
};
28+
29+
function add(n1, n2, lastCarry) {
30+
let result = 0
31+
let nextcarry = 0
32+
let num = n1 + n2 + lastCarry
33+
if(num >= 10) {
34+
let strnum = String(num)
35+
result = strnum.slice(1) * 1
36+
nextcarry = strnum.slice(0,1) * 1
37+
} else {
38+
result = num
39+
}
40+
return {
41+
result,
42+
nextcarry
43+
}
44+
}
45+
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
/**
2+
* @param {number[]} nums
3+
* @return {number}
4+
674. 最长连续递增序列
5+
*/
6+
var findLengthOfLCIS = function(nums) {
7+
let len = nums.length
8+
let max = 0
9+
let count = 1
10+
for(let i = 0; i < len; i++) {
11+
if(nums[i] < nums[i+1]) {
12+
count++
13+
} else {
14+
max = Math.max(count, max)
15+
count = 1
16+
}
17+
}
18+
return max
19+
};

js-code/code/最长递增子序列.js

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
// 动态规划,一个完整的问题,它可以分解成很多更小规模的子问题,然后由这些小规模的子问题,小规模问题的最优解,就可以推导出来整个问题的最优解
2+
// 只有你局部做到最优,那么你全局整个问题都是最优的
3+
// 动态规划:状态 + 选择
4+
/**
5+
[10,9,2,5,3,7,101,18]
6+
[10,9,2,5,3,7,101]
7+
[10,9,2,5,3,7] 18 3 + 1 = 4
8+
3
9+
*/
10+
/**
11+
* @param {number[]} nums
12+
* @return {number}
13+
300.最长递增子序列 #动态规划
14+
*/
15+
var lengthOfLIS = function(nums) {
16+
let len = nums.length
17+
let max = 1
18+
let dp = new Array(len).fill(1)
19+
for (let i = 0; i<len; i++) {
20+
for (let j = 0; j < i; j++) {
21+
if(nums[j] <nums[i]) {
22+
dp[i] = Math.max(dp[j] + 1, dp[i])
23+
}
24+
}
25+
max = Math.max(dp[i], max)
26+
}
27+
return max
28+
};

js-code/js/Object.create.js

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
// 传入的对象作为原型
2+
function create(ojb) {
3+
// 构造函数
4+
function F() {}
5+
// 构造函数的原型 被 赋值为 传入的对象
6+
F.prototype = ojb
7+
// 返回新的对象实例
8+
return new F()
9+
}

js-code/js/Promise.all.js

Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
// 接收一个Promie实例的数组或具有Iterator接口的对象作为参数
2+
// 这个方法返回一个新的promise对象
3+
// 遍历传入的参数,用Promise.resolve()将参数"包一层",使其变成一个promise对象
4+
// 参数所有回调成功才是成功,返回值数组与参数顺序一致
5+
// 参数数组其中一个失败,则触发失败状态,第一个触发失败的Promise错误信息作为Promise.all的错误信息
6+
7+
// Promise.all 用来处理多个并发请求,也是为了页面数据构造的方便
8+
9+
function promiseAll(promises) {
10+
return new Promise(function(resolve, reject) {
11+
// 返回一个promise
12+
if(!Array.isArray(promises)) {
13+
// 判断参数是否为数组
14+
throw new TypeError(`argument must be a array`)
15+
}
16+
var resolvedCounter = 0; // 计算数量到达数组的长度
17+
18+
var resolvedResult = []; // 得到的结果
19+
var promiseNum = promises.length; // 获取数组的长度
20+
21+
for(let i = 0; i < promiseNum; i++) {
22+
23+
Promise.resolve(promises[i]).then(value => {
24+
resolvedCounter++;
25+
resolvedResult[i] = value; // 放到结果数组里
26+
// 判断是否是时候了
27+
if(resolvedCounter === promiseNum) {
28+
return resolve(resolvedResult) // 获取所有值进行return
29+
}
30+
}, error => {
31+
return reject(error)
32+
})
33+
34+
}
35+
36+
})
37+
}
38+
39+
let p1 = new Promise(function(resolve, reject) {
40+
setTimeout(function() {
41+
resolve(1)
42+
}, 1000)
43+
})
44+
45+
let p2 = new Promise(function(resolve, reject) {
46+
setTimeout(function() {
47+
resolve(2)
48+
}, 2000)
49+
})
50+
51+
let p3 = new Promise(function(resolve, reject) {
52+
setTimeout(function() {
53+
resolve(3)
54+
}, 3000)
55+
})
56+
57+
promiseAll([p1, p2, p3]).then(res => {
58+
console.log(res) // [ 1, 2, 3 ]
59+
})

js-code/js/Promise.race.js

Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
// Promise.race(iterable) 方法返回一个 promise,一旦迭代器中的某个promise解决或拒绝,返回的promise就会解决或拒绝
2+
3+
function promiseRace(promises) {
4+
return new Promise(function(resolve, reject) {
5+
// 返回一个promise
6+
if(!Array.isArray(promises)) {
7+
// 判断参数是否为数组
8+
throw new TypeError(`argument must be a array`)
9+
}
10+
var promiseNum = promises.length; // 获取数组的长度
11+
for(let i = 0; i < promiseNum; i++) {
12+
13+
Promise.resolve(promises[i]).then(value => {
14+
return resolve(value)
15+
}, error => {
16+
return reject(error)
17+
})
18+
19+
}
20+
21+
})
22+
23+
// return new Promise(function(resolve, reject) {
24+
// if(!Array.isArray(promises)) {
25+
// throw new TypeError(`argument must be a array`)
26+
// }
27+
// var promiseNum = promises.length; // 获取数组的长度
28+
// for(let i = 0; i < promiseNum; i++) {
29+
// Promise.resolve(promises[i]).then(value => {
30+
// return resolve(value)
31+
// }, error => {
32+
// return reject(error)
33+
// })
34+
// }
35+
// })
36+
}
37+
38+
const promise1 = new Promise((resolve, reject) => {
39+
setTimeout(resolve, 500, 'one');
40+
});
41+
42+
const promise2 = new Promise((resolve, reject) => {
43+
setTimeout(reject, 100, 'two');
44+
});
45+
46+
Promise.race([promise1, promise2]).then((value) => {
47+
console.log(value);
48+
// Both resolve, but promise2 is faster
49+
},(error) => {
50+
console.log(error);
51+
});
52+
// expected output: "two"
53+
54+
promiseRace([promise1, promise2]).then((value) => {
55+
console.log(value);
56+
// Both resolve, but promise2 is faster
57+
},(error) => {
58+
console.log(error);
59+
});

js-code/js/Promise.then.js

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
// then方法返回一个新的promise实例
2+
// promise状态发生变化时 (resolve / reject 被调用时) 再执行then里的函数
3+
4+
then(onFulfilled, onReject) {
5+
// 保存前一个promise的this
6+
const self = this;
7+
8+
return new MyPromise((resolve,reject) => {
9+
// 封装前一个promise成功时执行的函数
10+
let fulfilled = () => {
11+
try {
12+
const result = onFulfilled(self.value); // 承前
13+
return result instanceof MyPromise ? result.then(resolve, reject) : resolve(result)
14+
} catch (err) {
15+
reject(err)
16+
}
17+
}
18+
19+
// 封装前一个promise失败时执行的函数
20+
let rejected = () => {
21+
try{
22+
const result = onReject(self.reason);
23+
return result instanceof MyPromise ? result.then(resolve, reject) : reject(result)
24+
} catch(err) {
25+
reject(err)
26+
}
27+
}
28+
29+
switch(self.status) {
30+
case PENDING:
31+
self.onFulfilledCallbacks.push(fulfilled);
32+
self.onRejectedCallbacks.push(reject);
33+
break;
34+
case FULFILLED:
35+
fulfilled();
36+
break;
37+
case REJECT:
38+
rejected();
39+
break;
40+
}
41+
42+
})
43+
}

js-code/js/apply.js

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
// apply()方法调用一个具有给定this值的函数,以及一个数组的形式提供的参数
2+
3+
Function.prototype.myApply = function(context) {
4+
// 判断调用对象是否为函数,即使我们是定义在函数的原型上的
5+
// 判断调用对象是否为函数
6+
if(typeof this !== 'function') {
7+
throw new TypeError('Error');
8+
}
9+
let result = null;
10+
// 判断context是否存在,如果不存在为window
11+
context = context || window;
12+
// 将函数设为对象的方法
13+
context.fn = this;
14+
// 数组
15+
if(arguments[1]) {
16+
result = context.fn(...arguments[1])
17+
} else {
18+
result = context.fn()
19+
}
20+
// 将属性删除
21+
delete context.fn;
22+
return result;
23+
}
24+
25+
const numbers = [5, 6, 2, 3, 7];
26+
27+
const max = Math.max.apply(null, numbers);
28+
29+
console.log(max);
30+
// expected output: 7

js-code/js/bind.js

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
// bind() 方法创建一个新的函数,在 bind() 被调用时,这个新函数的 this 被指定为 bind() 的第一个参数,而其余参数将作为新函数的参数,供调用时使用。
2+
3+
Function.prototype.myBind = function(context) {
4+
// 判断调用对象是否为函数
5+
if(typeof this !== 'function') {
6+
throw new TypeError('Error')
7+
}
8+
// 获取参数
9+
var args = [...arguments].slice(1)
10+
fn = this;
11+
return function(fn){
12+
// 根据调用方式,传入不同绑定值
13+
return fn.apply(
14+
this instanceof Fn ? this : context,
15+
args.concat(...arguments)
16+
);
17+
};
18+
};
19+
20+
21+
// const module = {
22+
// x: 42,
23+
// getX: function() {
24+
// return this.x;
25+
// }
26+
// };
27+
28+
// const unboundGetX = module.getX;
29+
// console.log(unboundGetX()); // The function gets invoked at the global scope
30+
// expected output: undefined
31+
32+
// const boundGetX = unboundGetX.bind(module);
33+
// console.log(boundGetX());
34+
// expected output: 42

0 commit comments

Comments
 (0)