From b11efd2f57caa8354fe3eab1caa018108d53b905 Mon Sep 17 00:00:00 2001 From: Libin YANG Date: Wed, 10 Sep 2025 21:42:44 +0800 Subject: [PATCH] feat: add solutions to lc problem: No.3673 --- .../README.md | 24 ++++++++ .../README_EN.md | 24 ++++++++ .../Solution.rs | 19 +++++++ .../3673.Find Zombie Sessions/README.md | 55 ++++++++++++++++++- .../3673.Find Zombie Sessions/README_EN.md | 55 ++++++++++++++++++- .../3673.Find Zombie Sessions/Solution.py | 31 +++++++++++ .../3673.Find Zombie Sessions/Solution.sql | 14 +++++ 7 files changed, 218 insertions(+), 4 deletions(-) create mode 100644 solution/3000-3099/3005.Count Elements With Maximum Frequency/Solution.rs create mode 100644 solution/3600-3699/3673.Find Zombie Sessions/Solution.py create mode 100644 solution/3600-3699/3673.Find Zombie Sessions/Solution.sql diff --git a/solution/3000-3099/3005.Count Elements With Maximum Frequency/README.md b/solution/3000-3099/3005.Count Elements With Maximum Frequency/README.md index ff70843e27dd8..202562211927e 100644 --- a/solution/3000-3099/3005.Count Elements With Maximum Frequency/README.md +++ b/solution/3000-3099/3005.Count Elements With Maximum Frequency/README.md @@ -169,6 +169,30 @@ function maxFrequencyElements(nums: number[]): number { } ``` +#### Rust + +```rust +impl Solution { + pub fn max_frequency_elements(nums: Vec) -> i32 { + let mut cnt = [0; 101]; + for &x in &nums { + cnt[x as usize] += 1; + } + let mut ans = 0; + let mut mx = -1; + for &x in &cnt { + if mx < x { + mx = x; + ans = x; + } else if mx == x { + ans += x; + } + } + ans + } +} +``` + diff --git a/solution/3000-3099/3005.Count Elements With Maximum Frequency/README_EN.md b/solution/3000-3099/3005.Count Elements With Maximum Frequency/README_EN.md index b373ee56ae147..ac39e762a25b9 100644 --- a/solution/3000-3099/3005.Count Elements With Maximum Frequency/README_EN.md +++ b/solution/3000-3099/3005.Count Elements With Maximum Frequency/README_EN.md @@ -167,6 +167,30 @@ function maxFrequencyElements(nums: number[]): number { } ``` +#### Rust + +```rust +impl Solution { + pub fn max_frequency_elements(nums: Vec) -> i32 { + let mut cnt = [0; 101]; + for &x in &nums { + cnt[x as usize] += 1; + } + let mut ans = 0; + let mut mx = -1; + for &x in &cnt { + if mx < x { + mx = x; + ans = x; + } else if mx == x { + ans += x; + } + } + ans + } +} +``` + diff --git a/solution/3000-3099/3005.Count Elements With Maximum Frequency/Solution.rs b/solution/3000-3099/3005.Count Elements With Maximum Frequency/Solution.rs new file mode 100644 index 0000000000000..7549d422dfb83 --- /dev/null +++ b/solution/3000-3099/3005.Count Elements With Maximum Frequency/Solution.rs @@ -0,0 +1,19 @@ +impl Solution { + pub fn max_frequency_elements(nums: Vec) -> i32 { + let mut cnt = [0; 101]; + for &x in &nums { + cnt[x as usize] += 1; + } + let mut ans = 0; + let mut mx = -1; + for &x in &cnt { + if mx < x { + mx = x; + ans = x; + } else if mx == x { + ans += x; + } + } + ans + } +} diff --git a/solution/3600-3699/3673.Find Zombie Sessions/README.md b/solution/3600-3699/3673.Find Zombie Sessions/README.md index 29b3e3e4f8b55..44858d165a724 100644 --- a/solution/3600-3699/3673.Find Zombie Sessions/README.md +++ b/solution/3600-3699/3673.Find Zombie Sessions/README.md @@ -20,7 +20,7 @@ tags:
 +------------------+----------+
-| Column Name      | Type     | 
+| Column Name      | Type     |
 +------------------+----------+
 | event_id         | int      |
 | user_id          | int      |
@@ -151,14 +151,65 @@ event_value represents: for purchase - amount in dollars, for scroll - pixels sc
 
 
 
-### 方法一
+### 方法一:分组统计
+
+我们可以将会话按照 `session_id` 进行分组,统计每个会话的持续时间、滚动事件数、点击事件数和购买事件数,然后根据题目中的条件进行筛选,最后按照滚动事件数降序、会话 ID 升序排序。
 
 
 
 #### MySQL
 
 ```sql
+# Write your MySQL query statement below
+SELECT
+    session_id,
+    user_id,
+    TIMESTAMPDIFF(MINUTE, MIN(event_timestamp), MAX(event_timestamp)) session_duration_minutes,
+    SUM(event_type = 'scroll') scroll_count
+FROM app_events
+GROUP BY session_id
+HAVING
+    session_duration_minutes >= 30
+    AND SUM(event_type = 'click') / SUM(event_type = 'scroll') < 0.2
+    AND SUM(event_type = 'purchase') = 0
+    AND SUM(event_type = 'scroll') >= 5
+ORDER BY scroll_count DESC, session_id;
+```
+
+#### Pandas
+
+```python
+import pandas as pd
+
+
+def find_zombie_sessions(app_events: pd.DataFrame) -> pd.DataFrame:
+    if not pd.api.types.is_datetime64_any_dtype(app_events["event_timestamp"]):
+        app_events["event_timestamp"] = pd.to_datetime(app_events["event_timestamp"])
+
+    grouped = app_events.groupby(["session_id", "user_id"])
+
+    result = grouped.agg(
+        session_duration_minutes=(
+            "event_timestamp",
+            lambda x: (x.max() - x.min()).total_seconds() // 60,
+        ),
+        scroll_count=("event_type", lambda x: (x == "scroll").sum()),
+        click_count=("event_type", lambda x: (x == "click").sum()),
+        purchase_count=("event_type", lambda x: (x == "purchase").sum()),
+    ).reset_index()
+
+    result = result[
+        (result["session_duration_minutes"] >= 30)
+        & (result["click_count"] / result["scroll_count"] < 0.2)
+        & (result["purchase_count"] == 0)
+        & (result["scroll_count"] >= 5)
+    ]
+
+    result = result.sort_values(
+        by=["scroll_count", "session_id"], ascending=[False, True]
+    ).reset_index(drop=True)
 
+    return result[["session_id", "user_id", "session_duration_minutes", "scroll_count"]]
 ```
 
 
diff --git a/solution/3600-3699/3673.Find Zombie Sessions/README_EN.md b/solution/3600-3699/3673.Find Zombie Sessions/README_EN.md
index 69abc735a3a8e..54e5a4b1c5249 100644
--- a/solution/3600-3699/3673.Find Zombie Sessions/README_EN.md	
+++ b/solution/3600-3699/3673.Find Zombie Sessions/README_EN.md	
@@ -20,7 +20,7 @@ tags:
 
 
 +------------------+----------+
-| Column Name      | Type     | 
+| Column Name      | Type     |
 +------------------+----------+
 | event_id         | int      |
 | user_id          | int      |
@@ -151,14 +151,65 @@ event_value represents: for purchase - amount in dollars, for scroll - pixels sc
 
 
 
-### Solution 1
+### Solution 1: Grouped Aggregation
+
+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.
 
 
 
 #### MySQL
 
 ```sql
+# Write your MySQL query statement below
+SELECT
+    session_id,
+    user_id,
+    TIMESTAMPDIFF(MINUTE, MIN(event_timestamp), MAX(event_timestamp)) session_duration_minutes,
+    SUM(event_type = 'scroll') scroll_count
+FROM app_events
+GROUP BY session_id
+HAVING
+    session_duration_minutes >= 30
+    AND SUM(event_type = 'click') / SUM(event_type = 'scroll') < 0.2
+    AND SUM(event_type = 'purchase') = 0
+    AND SUM(event_type = 'scroll') >= 5
+ORDER BY scroll_count DESC, session_id;
+```
+
+#### Pandas
+
+```python
+import pandas as pd
+
+
+def find_zombie_sessions(app_events: pd.DataFrame) -> pd.DataFrame:
+    if not pd.api.types.is_datetime64_any_dtype(app_events["event_timestamp"]):
+        app_events["event_timestamp"] = pd.to_datetime(app_events["event_timestamp"])
+
+    grouped = app_events.groupby(["session_id", "user_id"])
+
+    result = grouped.agg(
+        session_duration_minutes=(
+            "event_timestamp",
+            lambda x: (x.max() - x.min()).total_seconds() // 60,
+        ),
+        scroll_count=("event_type", lambda x: (x == "scroll").sum()),
+        click_count=("event_type", lambda x: (x == "click").sum()),
+        purchase_count=("event_type", lambda x: (x == "purchase").sum()),
+    ).reset_index()
+
+    result = result[
+        (result["session_duration_minutes"] >= 30)
+        & (result["click_count"] / result["scroll_count"] < 0.2)
+        & (result["purchase_count"] == 0)
+        & (result["scroll_count"] >= 5)
+    ]
+
+    result = result.sort_values(
+        by=["scroll_count", "session_id"], ascending=[False, True]
+    ).reset_index(drop=True)
 
+    return result[["session_id", "user_id", "session_duration_minutes", "scroll_count"]]
 ```
 
 
diff --git a/solution/3600-3699/3673.Find Zombie Sessions/Solution.py b/solution/3600-3699/3673.Find Zombie Sessions/Solution.py
new file mode 100644
index 0000000000000..276a36612b987
--- /dev/null
+++ b/solution/3600-3699/3673.Find Zombie Sessions/Solution.py	
@@ -0,0 +1,31 @@
+import pandas as pd
+
+
+def find_zombie_sessions(app_events: pd.DataFrame) -> pd.DataFrame:
+    if not pd.api.types.is_datetime64_any_dtype(app_events["event_timestamp"]):
+        app_events["event_timestamp"] = pd.to_datetime(app_events["event_timestamp"])
+
+    grouped = app_events.groupby(["session_id", "user_id"])
+
+    result = grouped.agg(
+        session_duration_minutes=(
+            "event_timestamp",
+            lambda x: (x.max() - x.min()).total_seconds() // 60,
+        ),
+        scroll_count=("event_type", lambda x: (x == "scroll").sum()),
+        click_count=("event_type", lambda x: (x == "click").sum()),
+        purchase_count=("event_type", lambda x: (x == "purchase").sum()),
+    ).reset_index()
+
+    result = result[
+        (result["session_duration_minutes"] >= 30)
+        & (result["click_count"] / result["scroll_count"] < 0.2)
+        & (result["purchase_count"] == 0)
+        & (result["scroll_count"] >= 5)
+    ]
+
+    result = result.sort_values(
+        by=["scroll_count", "session_id"], ascending=[False, True]
+    ).reset_index(drop=True)
+
+    return result[["session_id", "user_id", "session_duration_minutes", "scroll_count"]]
diff --git a/solution/3600-3699/3673.Find Zombie Sessions/Solution.sql b/solution/3600-3699/3673.Find Zombie Sessions/Solution.sql
new file mode 100644
index 0000000000000..6c543576a02a9
--- /dev/null
+++ b/solution/3600-3699/3673.Find Zombie Sessions/Solution.sql	
@@ -0,0 +1,14 @@
+# Write your MySQL query statement below
+SELECT
+    session_id,
+    user_id,
+    TIMESTAMPDIFF(MINUTE, MIN(event_timestamp), MAX(event_timestamp)) session_duration_minutes,
+    SUM(event_type = 'scroll') scroll_count
+FROM app_events
+GROUP BY session_id
+HAVING
+    session_duration_minutes >= 30
+    AND SUM(event_type = 'click') / SUM(event_type = 'scroll') < 0.2
+    AND SUM(event_type = 'purchase') = 0
+    AND SUM(event_type = 'scroll') >= 5
+ORDER BY scroll_count DESC, session_id;