Skip to content

Commit dbf0f24

Browse files
authored
feat: add solutions to lc problem: No.3673 (#4712)
1 parent 8507175 commit dbf0f24

File tree

7 files changed

+218
-4
lines changed

7 files changed

+218
-4
lines changed

solution/3000-3099/3005.Count Elements With Maximum Frequency/README.md

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -169,6 +169,30 @@ function maxFrequencyElements(nums: number[]): number {
169169
}
170170
```
171171

172+
#### Rust
173+
174+
```rust
175+
impl Solution {
176+
pub fn max_frequency_elements(nums: Vec<i32>) -> i32 {
177+
let mut cnt = [0; 101];
178+
for &x in &nums {
179+
cnt[x as usize] += 1;
180+
}
181+
let mut ans = 0;
182+
let mut mx = -1;
183+
for &x in &cnt {
184+
if mx < x {
185+
mx = x;
186+
ans = x;
187+
} else if mx == x {
188+
ans += x;
189+
}
190+
}
191+
ans
192+
}
193+
}
194+
```
195+
172196
<!-- tabs:end -->
173197

174198
<!-- solution:end -->

solution/3000-3099/3005.Count Elements With Maximum Frequency/README_EN.md

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -167,6 +167,30 @@ function maxFrequencyElements(nums: number[]): number {
167167
}
168168
```
169169

170+
#### Rust
171+
172+
```rust
173+
impl Solution {
174+
pub fn max_frequency_elements(nums: Vec<i32>) -> i32 {
175+
let mut cnt = [0; 101];
176+
for &x in &nums {
177+
cnt[x as usize] += 1;
178+
}
179+
let mut ans = 0;
180+
let mut mx = -1;
181+
for &x in &cnt {
182+
if mx < x {
183+
mx = x;
184+
ans = x;
185+
} else if mx == x {
186+
ans += x;
187+
}
188+
}
189+
ans
190+
}
191+
}
192+
```
193+
170194
<!-- tabs:end -->
171195

172196
<!-- solution:end -->
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
impl Solution {
2+
pub fn max_frequency_elements(nums: Vec<i32>) -> i32 {
3+
let mut cnt = [0; 101];
4+
for &x in &nums {
5+
cnt[x as usize] += 1;
6+
}
7+
let mut ans = 0;
8+
let mut mx = -1;
9+
for &x in &cnt {
10+
if mx < x {
11+
mx = x;
12+
ans = x;
13+
} else if mx == x {
14+
ans += x;
15+
}
16+
}
17+
ans
18+
}
19+
}

solution/3600-3699/3673.Find Zombie Sessions/README.md

Lines changed: 53 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ tags:
2020

2121
<pre>
2222
+------------------+----------+
23-
| Column Name | Type |
23+
| Column Name | Type |
2424
+------------------+----------+
2525
| event_id | int |
2626
| user_id | int |
@@ -151,14 +151,65 @@ event_value represents: for purchase - amount in dollars, for scroll - pixels sc
151151

152152
<!-- solution:start -->
153153

154-
### 方法一
154+
### 方法一:分组统计
155+
156+
我们可以将会话按照 `session_id` 进行分组,统计每个会话的持续时间、滚动事件数、点击事件数和购买事件数,然后根据题目中的条件进行筛选,最后按照滚动事件数降序、会话 ID 升序排序。
155157

156158
<!-- tabs:start -->
157159

158160
#### MySQL
159161

160162
```sql
163+
# Write your MySQL query statement below
164+
SELECT
165+
session_id,
166+
user_id,
167+
TIMESTAMPDIFF(MINUTE, MIN(event_timestamp), MAX(event_timestamp)) session_duration_minutes,
168+
SUM(event_type = 'scroll') scroll_count
169+
FROM app_events
170+
GROUP BY session_id
171+
HAVING
172+
session_duration_minutes >= 30
173+
AND SUM(event_type = 'click') / SUM(event_type = 'scroll') < 0.2
174+
AND SUM(event_type = 'purchase') = 0
175+
AND SUM(event_type = 'scroll') >= 5
176+
ORDER BY scroll_count DESC, session_id;
177+
```
178+
179+
#### Pandas
180+
181+
```python
182+
import pandas as pd
183+
184+
185+
def find_zombie_sessions(app_events: pd.DataFrame) -> pd.DataFrame:
186+
if not pd.api.types.is_datetime64_any_dtype(app_events["event_timestamp"]):
187+
app_events["event_timestamp"] = pd.to_datetime(app_events["event_timestamp"])
188+
189+
grouped = app_events.groupby(["session_id", "user_id"])
190+
191+
result = grouped.agg(
192+
session_duration_minutes=(
193+
"event_timestamp",
194+
lambda x: (x.max() - x.min()).total_seconds() // 60,
195+
),
196+
scroll_count=("event_type", lambda x: (x == "scroll").sum()),
197+
click_count=("event_type", lambda x: (x == "click").sum()),
198+
purchase_count=("event_type", lambda x: (x == "purchase").sum()),
199+
).reset_index()
200+
201+
result = result[
202+
(result["session_duration_minutes"] >= 30)
203+
& (result["click_count"] / result["scroll_count"] < 0.2)
204+
& (result["purchase_count"] == 0)
205+
& (result["scroll_count"] >= 5)
206+
]
207+
208+
result = result.sort_values(
209+
by=["scroll_count", "session_id"], ascending=[False, True]
210+
).reset_index(drop=True)
161211

212+
return result[["session_id", "user_id", "session_duration_minutes", "scroll_count"]]
162213
```
163214

164215
<!-- tabs:end -->

solution/3600-3699/3673.Find Zombie Sessions/README_EN.md

Lines changed: 53 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ tags:
2020

2121
<pre>
2222
+------------------+----------+
23-
| Column Name | Type |
23+
| Column Name | Type |
2424
+------------------+----------+
2525
| event_id | int |
2626
| user_id | int |
@@ -151,14 +151,65 @@ event_value represents: for purchase - amount in dollars, for scroll - pixels sc
151151

152152
<!-- solution:start -->
153153

154-
### Solution 1
154+
### Solution 1: Grouped Aggregation
155+
156+
We can group the sessions by session_id, calculate the session duration, the number of scroll events, click events, and purchase events for each session, then filter according to the conditions given in the problem. Finally, we sort by the number of scroll events in descending order and by session ID in ascending order.
155157

156158
<!-- tabs:start -->
157159

158160
#### MySQL
159161

160162
```sql
163+
# Write your MySQL query statement below
164+
SELECT
165+
session_id,
166+
user_id,
167+
TIMESTAMPDIFF(MINUTE, MIN(event_timestamp), MAX(event_timestamp)) session_duration_minutes,
168+
SUM(event_type = 'scroll') scroll_count
169+
FROM app_events
170+
GROUP BY session_id
171+
HAVING
172+
session_duration_minutes >= 30
173+
AND SUM(event_type = 'click') / SUM(event_type = 'scroll') < 0.2
174+
AND SUM(event_type = 'purchase') = 0
175+
AND SUM(event_type = 'scroll') >= 5
176+
ORDER BY scroll_count DESC, session_id;
177+
```
178+
179+
#### Pandas
180+
181+
```python
182+
import pandas as pd
183+
184+
185+
def find_zombie_sessions(app_events: pd.DataFrame) -> pd.DataFrame:
186+
if not pd.api.types.is_datetime64_any_dtype(app_events["event_timestamp"]):
187+
app_events["event_timestamp"] = pd.to_datetime(app_events["event_timestamp"])
188+
189+
grouped = app_events.groupby(["session_id", "user_id"])
190+
191+
result = grouped.agg(
192+
session_duration_minutes=(
193+
"event_timestamp",
194+
lambda x: (x.max() - x.min()).total_seconds() // 60,
195+
),
196+
scroll_count=("event_type", lambda x: (x == "scroll").sum()),
197+
click_count=("event_type", lambda x: (x == "click").sum()),
198+
purchase_count=("event_type", lambda x: (x == "purchase").sum()),
199+
).reset_index()
200+
201+
result = result[
202+
(result["session_duration_minutes"] >= 30)
203+
& (result["click_count"] / result["scroll_count"] < 0.2)
204+
& (result["purchase_count"] == 0)
205+
& (result["scroll_count"] >= 5)
206+
]
207+
208+
result = result.sort_values(
209+
by=["scroll_count", "session_id"], ascending=[False, True]
210+
).reset_index(drop=True)
161211

212+
return result[["session_id", "user_id", "session_duration_minutes", "scroll_count"]]
162213
```
163214

164215
<!-- tabs:end -->
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
import pandas as pd
2+
3+
4+
def find_zombie_sessions(app_events: pd.DataFrame) -> pd.DataFrame:
5+
if not pd.api.types.is_datetime64_any_dtype(app_events["event_timestamp"]):
6+
app_events["event_timestamp"] = pd.to_datetime(app_events["event_timestamp"])
7+
8+
grouped = app_events.groupby(["session_id", "user_id"])
9+
10+
result = grouped.agg(
11+
session_duration_minutes=(
12+
"event_timestamp",
13+
lambda x: (x.max() - x.min()).total_seconds() // 60,
14+
),
15+
scroll_count=("event_type", lambda x: (x == "scroll").sum()),
16+
click_count=("event_type", lambda x: (x == "click").sum()),
17+
purchase_count=("event_type", lambda x: (x == "purchase").sum()),
18+
).reset_index()
19+
20+
result = result[
21+
(result["session_duration_minutes"] >= 30)
22+
& (result["click_count"] / result["scroll_count"] < 0.2)
23+
& (result["purchase_count"] == 0)
24+
& (result["scroll_count"] >= 5)
25+
]
26+
27+
result = result.sort_values(
28+
by=["scroll_count", "session_id"], ascending=[False, True]
29+
).reset_index(drop=True)
30+
31+
return result[["session_id", "user_id", "session_duration_minutes", "scroll_count"]]
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
# Write your MySQL query statement below
2+
SELECT
3+
session_id,
4+
user_id,
5+
TIMESTAMPDIFF(MINUTE, MIN(event_timestamp), MAX(event_timestamp)) session_duration_minutes,
6+
SUM(event_type = 'scroll') scroll_count
7+
FROM app_events
8+
GROUP BY session_id
9+
HAVING
10+
session_duration_minutes >= 30
11+
AND SUM(event_type = 'click') / SUM(event_type = 'scroll') < 0.2
12+
AND SUM(event_type = 'purchase') = 0
13+
AND SUM(event_type = 'scroll') >= 5
14+
ORDER BY scroll_count DESC, session_id;

0 commit comments

Comments
 (0)