Skip to content

Commit 0918736

Browse files
committed
feat: add solutions to lc problems: No.2630,2631
* No.2630.Memoize II * No.2631.Group By
1 parent cdbcb37 commit 0918736

File tree

6 files changed

+143
-0
lines changed

6 files changed

+143
-0
lines changed

solution/2600-2699/2630.Memoize II/README.md

+31
Original file line numberDiff line numberDiff line change
@@ -69,14 +69,45 @@ fn = function (a, b) { return ({...a, ...b}); }
6969

7070
<!-- 这里可写通用的实现逻辑 -->
7171

72+
**方法一:哈希表**
73+
74+
我们用哈希表 $cache$ 记录函数调用的结果,其中键为函数参数,值为函数返回值。当函数被调用时,先将参数转换为字符串作为键,然后在 $cache$ 中查找,如果找到则直接返回,否则调用函数并将结果存入 $cache$ 中。
75+
76+
时间复杂度 $O(1)$,空间复杂度 $O(n)$,其中 $n$ 为函数调用的次数。
77+
7278
<!-- tabs:start -->
7379

7480
### **TypeScript**
7581

7682
<!-- 这里可写当前语言的特殊实现逻辑 -->
7783

7884
```ts
85+
type Fn = (...params: any) => any;
86+
87+
function memoize(fn: Fn): Fn {
88+
const cache: Map<string, any> = new Map();
89+
90+
return function (...args) {
91+
const key = args.join('-');
92+
if (cache.has(key)) {
93+
return cache.get(key);
94+
}
95+
const ans = fn.apply(this, args);
96+
cache.set(key, ans);
97+
return ans;
98+
};
99+
}
79100

101+
/**
102+
* let callCount = 0;
103+
* const memoizedFn = memoize(function (a, b) {
104+
* callCount += 1;
105+
* return a + b;
106+
* })
107+
* memoizedFn(2, 3) // 5
108+
* memoizedFn(2, 3) // 5
109+
* console.log(callCount) // 1
110+
*/
80111
```
81112

82113
### **...**

solution/2600-2699/2630.Memoize II/README_EN.md

+25
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,32 @@ Merging two empty objects will always result in an empty object. The 2nd and 3rd
6868
### **TypeScript**
6969

7070
```ts
71+
type Fn = (...params: any) => any;
72+
73+
function memoize(fn: Fn): Fn {
74+
const cache: Map<string, any> = new Map();
75+
76+
return function (...args) {
77+
const key = args.join('-');
78+
if (cache.has(key)) {
79+
return cache.get(key);
80+
}
81+
const ans = fn.apply(this, args);
82+
cache.set(key, ans);
83+
return ans;
84+
};
85+
}
7186

87+
/**
88+
* let callCount = 0;
89+
* const memoizedFn = memoize(function (a, b) {
90+
* callCount += 1;
91+
* return a + b;
92+
* })
93+
* memoizedFn(2, 3) // 5
94+
* memoizedFn(2, 3) // 5
95+
* console.log(callCount) // 1
96+
*/
7297
```
7398

7499
### **...**
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
type Fn = (...params: any) => any;
2+
3+
function memoize(fn: Fn): Fn {
4+
const cache: Map<string, any> = new Map();
5+
6+
return function (...args) {
7+
const key = args.join('-');
8+
if (cache.has(key)) {
9+
return cache.get(key);
10+
}
11+
const ans = fn.apply(this, args);
12+
cache.set(key, ans);
13+
return ans;
14+
};
15+
}
16+
17+
/**
18+
* let callCount = 0;
19+
* const memoizedFn = memoize(function (a, b) {
20+
* callCount += 1;
21+
* return a + b;
22+
* })
23+
* memoizedFn(2, 3) // 5
24+
* memoizedFn(2, 3) // 5
25+
* console.log(callCount) // 1
26+
*/

solution/2600-2699/2631.Group By/README.md

+20
Original file line numberDiff line numberDiff line change
@@ -103,7 +103,27 @@ fn = function (n) {
103103
<!-- 这里可写当前语言的特殊实现逻辑 -->
104104

105105
```ts
106+
declare global {
107+
interface Array<T> {
108+
groupBy(fn: (item: T) => string): Record<string, T[]>;
109+
}
110+
}
106111

112+
Array.prototype.groupBy = function (fn) {
113+
return this.reduce((acc, item) => {
114+
const key = fn(item);
115+
if (acc[key]) {
116+
acc[key].push(item);
117+
} else {
118+
acc[key] = [item];
119+
}
120+
return acc;
121+
}, {});
122+
};
123+
124+
/**
125+
* [1,2,3].groupBy(String) // {"1":[1],"2":[2],"3":[3]}
126+
*/
107127
```
108128

109129
### **...**

solution/2600-2699/2631.Group By/README_EN.md

+20
Original file line numberDiff line numberDiff line change
@@ -95,7 +95,27 @@ The selector function splits the array by whether each number is greater than 5.
9595
### **TypeScript**
9696

9797
```ts
98+
declare global {
99+
interface Array<T> {
100+
groupBy(fn: (item: T) => string): Record<string, T[]>;
101+
}
102+
}
98103

104+
Array.prototype.groupBy = function (fn) {
105+
return this.reduce((acc, item) => {
106+
const key = fn(item);
107+
if (acc[key]) {
108+
acc[key].push(item);
109+
} else {
110+
acc[key] = [item];
111+
}
112+
return acc;
113+
}, {});
114+
};
115+
116+
/**
117+
* [1,2,3].groupBy(String) // {"1":[1],"2":[2],"3":[3]}
118+
*/
99119
```
100120

101121
### **...**
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
declare global {
2+
interface Array<T> {
3+
groupBy(fn: (item: T) => string): Record<string, T[]>;
4+
}
5+
}
6+
7+
Array.prototype.groupBy = function (fn) {
8+
return this.reduce((acc, item) => {
9+
const key = fn(item);
10+
if (acc[key]) {
11+
acc[key].push(item);
12+
} else {
13+
acc[key] = [item];
14+
}
15+
return acc;
16+
}, {});
17+
};
18+
19+
/**
20+
* [1,2,3].groupBy(String) // {"1":[1],"2":[2],"3":[3]}
21+
*/

0 commit comments

Comments
 (0)