1四數相加 II
給你四個整數數組?nums1
、nums2
、nums3
?和?nums4
?,數組長度都是?n
?,請你計算有多少個元組?(i, j, k, l)
?能滿足:
0 <= i, j, k, l < n
nums1[i] + nums2[j] + nums3[k] + nums4[l] == 0
示例 1:
輸入:nums1 = [1,2], nums2 = [-2,-1], nums3 = [-1,2], nums4 = [0,2] 輸出:2 解釋: 兩個元組如下: 1. (0, 0, 0, 1) -> nums1[0] + nums2[0] + nums3[0] + nums4[1] = 1 + (-2) + (-1) + 2 = 0 2. (1, 1, 0, 0) -> nums1[1] + nums2[1] + nums3[0] + nums4[0] = 2 + (-1) + (-1) + 0 = 0
示例 2:
輸入:nums1 = [0], nums2 = [0], nums3 = [0], nums4 = [0] 輸出:1
??提示:
n == nums1.length
n == nums2.length
n == nums3.length
n == nums4.length
1 <= n <= 200
-228 <= nums1[i], nums2[i], nums3[i], nums4[i] <= 228
思路:
-
初始化哈希表:?創建一個哈希表?
map
,用于存儲 nums1 和 nums2 中所有數的和及其出現次數。 -
計算和及其出現次數:?遍歷 nums1 和 nums2 中的所有數,計算它們的和,并更新哈希表中對應和的出現次數。
-
查找相加為零的數對:?遍歷 nums3 和 nums4 中的所有數,查找它們的和是否在哈希表中存在相反數。如果存在,則將對應和的出現次數加入計數器中。
-
返回結果:?返回計數器中的值,即滿足條件的數對數目。
代碼:
class Solution {
public:int fourSumCount(vector<int>& nums1, vector<int>& nums2, vector<int>& nums3, vector<int>& nums4) {// 哈希表用于存儲兩個數組中元素之和及其出現次數unordered_map<int, int> map;// 計算 nums1 和 nums2 中所有數的和及其出現次數for (int num1 : nums1) {for (int num2 : nums2) {// 更新哈希表中對應和的出現次數map[num1 + num2]++;}}// 初始化計數器int count = 0;// 遍歷 nums3 和 nums4 中所有數,查找是否存在相加為零的數對for (int num3 : nums3) {for (int num4 : nums4) {// 判斷是否存在相反數在哈希表中if (map.find(0 - (num3 + num4)) != map.end()) {// 更新計數器count += map[0 - (num3 + num4)];}}}// 返回計數器中的值,即滿足條件的數對數目return count;}
};
2每位經理的下屬員工數量
表:Employees
+-------------+----------+ | Column Name | Type | +-------------+----------+ | employee_id | int | | name | varchar | | reports_to | int | | age | int | +-------------+----------+ employee_id 是這個表中具有不同值的列。 該表包含員工以及需要聽取他們匯報的上級經理的 ID 的信息。 有些員工不需要向任何人匯報(reports_to 為空)。
對于此問題,我們將至少有一個其他員工需要向他匯報的員工,視為一個經理。
編寫一個解決方案來返回需要聽取匯報的所有經理的 ID、名稱、直接向該經理匯報的員工人數,以及這些員工的平均年齡,其中該平均年齡需要四舍五入到最接近的整數。
返回的結果集需要按照?employee_id
?進行排序。
結果的格式如下:
示例 1:
輸入: Employees 表: +-------------+---------+------------+-----+ | employee_id | name | reports_to | age | +-------------+---------+------------+-----+ | 9 | Hercy | null | 43 | | 6 | Alice | 9 | 41 | | 4 | Bob | 9 | 36 | | 2 | Winston | null | 37 | +-------------+---------+------------+-----+ 輸出: +-------------+-------+---------------+-------------+ | employee_id | name | reports_count | average_age | +-------------+-------+---------------+-------------+ | 9 | Hercy | 2 | 39 | +-------------+-------+---------------+-------------+ 解釋: Hercy 有兩個需要向他匯報的員工, 他們是 Alice and Bob. 他們的平均年齡是 (41+36)/2 = 38.5, 四舍五入的結果是 39.
示例 2:
輸入: Employees 表: +-------------+---------+------------+-----+ | employee_id | name ? ?| reports_to | age | |-------------|---------|------------|-----| | 1 ? ? ? ? ? | Michael | null ? ? ? | 45 ?| | 2 ? ? ? ? ? | Alice ? | 1 ? ? ? ? ?| 38 ?| | 3 ? ? ? ? ? | Bob ? ? | 1 ? ? ? ? ?| 42 ?| | 4 ? ? ? ? ? | Charlie | 2 ? ? ? ? ?| 34 ?| | 5 ? ? ? ? ? | David ? | 2 ? ? ? ? ?| 40 ?| | 6 ? ? ? ? ? | Eve ? ? | 3 ? ? ? ? ?| 37 ?| | 7 ? ? ? ? ? | Frank ? | null ? ? ? | 50 ?| | 8 ? ? ? ? ? | Grace ? | null ? ? ? | 48 ?| +-------------+---------+------------+-----+ 輸出: +-------------+---------+---------------+-------------+ | employee_id | name ? ?| reports_count | average_age | | ----------- | ------- | ------------- | ----------- | | 1 ? ? ? ? ? | Michael | 2 ? ? ? ? ? ? | 40 ? ? ? ? ?| | 2 ? ? ? ? ? | Alice ? | 2 ? ? ? ? ? ? | 37 ? ? ? ? ?| | 3 ? ? ? ? ? | Bob ? ? | 1 ? ? ? ? ? ? | 37 ? ? ? ? ?| +-------------+---------+---------------+-------------+
思路:
-
連接表:?使用 inner i?join將 Employees 表自連接,連接條件是員工的 employee_id 等于其直接上級的 reports_to。
-
計算直接下屬數量和平均年齡:?使用 count函數計算每個員工的直接下屬數量,并使用 avg?函數計算直接下屬的平均年齡。
-
分組和排序:?使用 GROUP BY 子句按照員工編號分組,然后使用 ORDER BY 子句按照員工編號進行排序。
代碼:
select a.employee_id as 'employee_id', a.name as 'name', count(b.employee_id) as 'reports_count', round(avg(b.age), 0) as 'average_age'
from Employees a inner join Employees b on a.employee_id = b.reports_to
group by a.employee_id
order by a.employee_id;
3查找每個員工花費的總時間
表:?Employees
+-------------+------+ | Column Name | Type | +-------------+------+ | emp_id | int | | event_day | date | | in_time | int | | out_time | int | +-------------+------+ 在 SQL 中,(emp_id, event_day, in_time) 是這個表的主鍵。 該表顯示了員工在辦公室的出入情況。 event_day 是此事件發生的日期,in_time 是員工進入辦公室的時間,而 out_time 是他們離開辦公室的時間。 in_time 和 out_time 的取值在1到1440之間。 題目保證同一天沒有兩個事件在時間上是相交的,并且保證 in_time 小于 out_time。
計算每位員工每天在辦公室花費的總時間(以分鐘為單位)。 請注意,在一天之內,同一員工是可以多次進入和離開辦公室的。 在辦公室里一次進出所花費的時間為out_time 減去 in_time。
返回結果表單的順序無要求。
查詢結果的格式如下:
示例 1:
輸入: Employees table: +--------+------------+---------+----------+ | emp_id | event_day | in_time | out_time | +--------+------------+---------+----------+ | 1 | 2020-11-28 | 4 | 32 | | 1 | 2020-11-28 | 55 | 200 | | 1 | 2020-12-03 | 1 | 42 | | 2 | 2020-11-28 | 3 | 33 | | 2 | 2020-12-09 | 47 | 74 | +--------+------------+---------+----------+ 輸出: +------------+--------+------------+ | day | emp_id | total_time | +------------+--------+------------+ | 2020-11-28 | 1 | 173 | | 2020-11-28 | 2 | 30 | | 2020-12-03 | 1 | 41 | | 2020-12-09 | 2 | 27 | +------------+--------+------------+ 解釋: 雇員 1 有三次進出: 有兩次發生在 2020-11-28 花費的時間為 (32 - 4) + (200 - 55) = 173, 有一次發生在 2020-12-03 花費的時間為 (42 - 1) = 41。 雇員 2 有兩次進出: 有一次發生在 2020-11-28 花費的時間為 (33 - 3) = 30, 有一次發生在 2020-12-09 花費的時間為 (74 - 47) = 27。
思路:
-
選擇字段:?選擇查詢結果需要顯示的字段,包括事件日期(event_day)、員工編號(emp_id)以及員工的總工作時長(total_time)。
-
計算總工作時長:?使用 SUM 函數計算每位員工在每個事件日期的總工作時長,這通過計算 out_time 減去 in_time 得到。
-
分組:?使用 GROUP BY 子句將數據按照事件日期(event_day)和員工編號(emp_id)分組,以便對每位員工在每日的工作時長進行統計。
代碼:
select event_day as day, emp_id, sum(out_time - in_time) as total_time
from Employees
group by event_day, emp_id;
4可回收且低脂的產品
表:Products
+-------------+---------+
| Column Name | Type |
+-------------+---------+
| product_id | int |
| low_fats | enum |
| recyclable | enum |
+-------------+---------+
product_id
是該表的主鍵(具有唯一值的列)。
low_fats 是枚舉類型,取值為以下兩種 ('Y', 'N'),其中 'Y' 表示該產品是低脂產品,'N' 表示不是低脂產品。
recyclable 是枚舉類型,取值為以下兩種 ('Y', 'N'),其中 'Y' 表示該產品可回收,而 'N' 表示不可回收。
編寫解決方案找出既是低脂又是可回收的產品編號。
返回結果?無順序要求?。
返回結果格式如下例所示:
示例 1:
輸入: Products 表: +-------------+----------+------------+ | product_id | low_fats | recyclable | +-------------+----------+------------+ | 0 | Y | N | | 1 | Y | Y | | 2 | N | Y | | 3 | Y | Y | | 4 | N | N | +-------------+----------+------------+ 輸出: +-------------+ | product_id | +-------------+ | 1 | | 3 | +-------------+ 解釋: 只有產品 id 為 1 和 3 的產品,既是低脂又是可回收的產品。
代碼:
selectproduct_id
fromProducts
wherelow_fats = 'Y' and recyclable = 'Y'