Skip to content

Commit 4efe515

Browse files
committed
https://leetcode.cn/problems/tweet-counts-per-frequency/
1 parent a0d6db6 commit 4efe515

File tree

4 files changed

+80
-4
lines changed

4 files changed

+80
-4
lines changed

README.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -844,6 +844,8 @@ https://leetcode.cn/problems/1-bit-and-2-bit-characters/
844844

845845
https://leetcode.cn/problems/design-twitter/
846846

847+
https://leetcode.cn/problems/tweet-counts-per-frequency/
848+
847849
#### 安装教程
848850

849851
1. 安装`deno`

deps.ts

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,8 @@ export { walk } from "https://deno.land/[email protected]/fs/mod.ts";
1616
export { parse } from "https://deno.land/[email protected]/flags/mod.ts";
1717
export { combinations } from "https://deno.land/x/[email protected]/mod.ts";
1818
export { isIP } from "https://deno.land/[email protected]/node/internal/net.ts";
19+
export { Heap } from "https://cdn.skypack.dev/@datastructures-js/[email protected]/?dts";
1920
export {
20-
Heap,
21-
} from "https://cdn.skypack.dev/@datastructures-js/[email protected]/?dts";
21+
BinarySearchTree,
22+
BinarySearchTreeNode,
23+
} from "https://cdn.skypack.dev/@datastructures-js/[email protected]/?dts";

design-twitter/index.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -51,8 +51,8 @@ export default class Twitter {
5151
}
5252

5353
follow(followerId: number, followeeId: number): void {
54-
const followee =
55-
this.#follower_to_followees.get(followerId) ?? new Set();
54+
const followee = this.#follower_to_followees.get(followerId) ??
55+
new Set();
5656

5757
followee.add(followeeId);
5858
this.#follower_to_followees.set(followerId, followee);

tweet-counts-per-frequency/index.ts

Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
1+
import { BinarySearchTree, BinarySearchTreeNode } from "../deps.ts";
2+
3+
export default class TweetCounts {
4+
#name_to_bst = new Map<string, BinarySearchTree<number, number>>();
5+
constructor() {}
6+
7+
recordTweet(tweetName: string, time: number): void {
8+
const bst = this.#name_to_bst.get(tweetName) ??
9+
new BinarySearchTree<number, number>();
10+
const node = bst.find(time);
11+
if (node) {
12+
node.setValue(node.getValue() + 1);
13+
return;
14+
}
15+
bst.insert(time, 1);
16+
this.#name_to_bst.set(tweetName, bst);
17+
}
18+
19+
getTweetCountsPerFrequency(
20+
freq: string,
21+
tweetName: string,
22+
startTime: number,
23+
endTime: number,
24+
): number[] {
25+
const bst = this.#name_to_bst.get(tweetName);
26+
if (!bst) return [];
27+
const length = freq === "minute"
28+
? 60
29+
: freq === "hour"
30+
? 3600
31+
: freq === "day"
32+
? 86400
33+
: 0;
34+
if (length === 0) {
35+
throw Error("invalid frequency");
36+
}
37+
const result: number[] = Array(
38+
Math.ceil((endTime - startTime + 1) / length),
39+
).fill(0);
40+
traversal_bst_range(
41+
bst.root(),
42+
startTime,
43+
endTime,
44+
(num: number, value: number) => {
45+
result[Math.floor((num - startTime + 1) / length)] += value;
46+
},
47+
);
48+
return result;
49+
}
50+
}
51+
export function traversal_bst_range<
52+
K extends string | number = number,
53+
V = number,
54+
>(
55+
node: BinarySearchTreeNode<K, V> | null | undefined,
56+
low: number,
57+
high: number,
58+
callback: (key: K, value: V) => void,
59+
) {
60+
if (!node) return;
61+
62+
const value = node.getKey();
63+
if (value <= high && value >= low) {
64+
callback(value, node.getValue());
65+
}
66+
if (value > low) {
67+
traversal_bst_range(node.getLeft(), low, high, callback);
68+
}
69+
if (value < high) {
70+
traversal_bst_range(node.getRight(), low, high, callback);
71+
}
72+
}

0 commit comments

Comments
 (0)