郑州专业做淘宝网站,深圳做网站推荐哪家公司,百度app优化,太原做网站公司哪家好1075. 项目员工 I
题目链接
1075. 项目员工 I
要求
查询每一个项目中员工的平均工作年限#xff0c;精确到小数点后两位。
表 P r o j e c t Project Project表中有project_id和employee_id的字段。 E m p l o y e e Employee Employee表中有employee_id、name和experien…1075. 项目员工 I
题目链接
1075. 项目员工 I
要求
查询每一个项目中员工的平均工作年限精确到小数点后两位。
表 P r o j e c t Project Project表中有project_id和employee_id的字段。 E m p l o y e e Employee Employee表中有employee_id、name和experience_years的字段。
知识点
round(a, b) 将一个小数精确到小数点后两位需要使用 M y S Q L MySQL MySQL中的四舍五入函数round(a, b)其中a为一个浮点数b为要精确的位数。例如round(3.14, 1)表示将3.14四舍五入到小数点后第一位结果为3.1。avg(f) 求平均值需要使用到 M y S Q L MySQL MySQL中的求平均值函数avg(f)其中f为统计的字段名。例如avg(experience_years)表示对表中的experience_years字段求平均值。内连接 join 对于两个或更多个表的题一般都会有连接的需求对于本题来说使用的是内连接即求两个表的交集。如果是外连接求的是一个集合加上它与另一个集合的交集起别名 as 给一个字段起别名时可以使用as当然也可以不使用。例如experience AS exp与experience exp等价但要注意原名和别名之间的空格不能少。分组 group by f 对于求平均值、求最值、计数等这类的聚合函数经常与分组一起使用因为没有必要求1条数据的平均值、最值等。分组的语法是group by f即按字段f对这张表进行分组f相同的值放在一组。例如group by project_id表示按project_id对每条数据进行分组。
思路
本题还是十分简单的一个项目有多个员工每个员工都有属于自己的工作年限要求一个项目中员工的平均工作年限只需要对该项目所有员工的工作年限求平均值即可然后按项目的id进行分组。
代码
selectproject_id,round(avg(experience_years), 2) average_years
fromProject p
joinEmployee e
onp.employee_id e.employee_id
group byproject_id1103. 分糖果 II
题目链接
1103. 分糖果 II
标签
模拟、数学
思路
题目要求给第一个小朋友1颗糖果给第二个小朋友2颗糖果以此类推。当给完最后一个小朋友n颗糖果后再从第一个小朋友开始给他n 1颗糖果给第二个小朋友n 2颗糖果以此类推直到没有糖果为止。注意最后一次给糖果时可能不是给前一个人的糖果数 1而是给完前一个人后剩下的糖果数。读完这段话后就会发现这道题是一个比较典型的模拟题只需要将描述翻译为代码即可。
小技巧
对于一个循环索引i从0循环到n可以这样写
if (i n) {i 0;
}这样写的代码会多一些以下这种方式使得代码更简洁但是此时的i如果循环太多次就会超出int的范围
i % n; // 使用索引时就写出该算式
i;代码
class Solution {public int[] distributeCandies(int candies, int num_people) {int[] res new int[num_people];int i 0;while (candies 0) {res[i % num_people] Math.min(candies, i 1);candies - Math.min(candies, i);}return res;}
}121. 买卖股票的最佳时机
题目链接
121. 买卖股票的最佳时机
标签
数组、动态规划
思路
题目要得到购买并售卖各一次股票的最大利润所以只需要找到卖股票前的最小股价即可但卖股票的日子不是一个固定值它从第二天开始向后不断迭代直到结束。如果股票的价格涨了就更新max值否则就更新最小股价。
代码
class Solution {public int maxProfit(int[] prices) {int in 0, out 1;int max 0;while (out prices.length) {int profit prices[out] - prices[in];if (profit 0) { // 股票涨了max Math.max(profit, max);} else { // 股票跌了in out;}out;}return max;}
}42. 接雨水
题目链接
42. 接雨水
标签
栈、数组、双指针、动态规划、单调栈
思路
本题采用的算法是动态规划从左到右遍历所有使用一个栈存储一些柱子的索引若当前的柱子比中间的柱子高就弹出中间的柱子如果对中间的柱子很疑惑可以先看下一段然后看是否有左柱子如果有左柱子则让结果数加上能接到的雨水。 为什么会有中间的柱子因为两个紧挨的柱子无法接到雨水若想要两个不紧挨柱子能够接到雨水则需要在这两个柱子中间放置更低的柱子由此可得出两个柱子间能够接到雨水的必要条件为两个柱子必须不紧挨并且在中间还有更低的柱子。 设左、中间、右柱子的索引分别为i, j, k、高度分别为 h i , h j , h k h_i, h_j, h_k hi,hj,hk计算能接到的雨水有两个需要注意的点公式为 r a i n ( k − i − 1 ) ∗ ( m i n ( h i , h k ) − h j ) rain (k - i - 1) * (min(h_i, h_k) - h_j) rain(k−i−1)∗(min(hi,hk)−hj)第一个注意的点是长度为 k − i − 1 k - i - 1 k−i−1而不是 k − i 1 k - i 1 k−i1第二个需要注意的点是长度乘的不是高度而是高度差 m i n ( h i , h k ) − h j min(h_i, h_k) - h_j min(hi,hk)−hj。
代码
class Solution {public int trap(int[] height) {int res 0;LinkedListInteger stack new LinkedList();for (int i 0; i height.length; i) {int right i; // 这里的right完全可以不定义只是为了可读性将所有出现right的地方替换为i即可while (!stack.isEmpty() height[stack.peek()] height[right]) {int center stack.pop();Integer left stack.peek();if (left ! null) {res (right - left - 1) * (Math.min(height[left], height[right]) - height[center]);}}stack.push(right);}return res;}
}注
题解中使用了二分法耗时更短可以用短板效应来理解这种解法接到的雨水由矮柱子决定。