今天起,如无特殊情况,就每天在这打卡学习记录啦
学习目标:
每天2-3到简单sql(刷完即止),每天复习代码随想录上的题目3道算法(时间充足可以继续),背诵的八股的问题也在这里记录了
力扣刷题
SQL
力扣1581:
解答思路:
1)本题关键点在于弄清楚外连接的条件,以及其实最后需要分组,注意判断null时不是 "= null",而是"is null"
#采用外连接的思路,之后通过is null进行筛选,分组,count()进行计算总数。select Visits.customer_id,count(Visits.visit_id) as count_no_transfrom Visitsleft join Transactionson Visits.visit_id = Transactions.visit_idwhere Transactions.transaction_id is nullgroup by Visits.customer_id
力扣1965:
解答思路:
1)这道题其实做多几道就会清楚一种方法是使用UNION,我直接的思路是,如何才能得到两个表的id到一张表去,其实就是使用UNION,得到一张id表之后,非丢失员工的id就会多次出现
# 同时出现在两个表里面的才是非丢失员工Employees.employee_id
# 使用UNION联合两个表的id,非丢失员工的id会多次出现
# 此时我们只计算出现一次的即可
select employee_id from (SELECT employee_id FROM Employees UNION ALL SELECT employee_id FROM Salaries) AS tgroup by employee_idhaving count(*) = 1order by employee_id
算法
力扣27:移除元素
解答思路:
1)这里使用双指针来解决,思路就是维护两个指针来实现找到不等于val的值和等于val的值
class Solution {//本题意思是求出长度和结果集public int removeElement(int[] nums, int val) {int res = 0;//思路,双指针修改,一个指向现在地址,一个往前走探路int l = 0,r = 0;for(;r < nums.length;r++){//判断当前位置是否等于val,等于则两者往前走if(nums[r] != val){//如果不等,则将r位置的数值覆盖到l上nums[l++] = nums[r];res ++;}}return res;}//该答案是对的,可以优化,其实left指针就是res了
}
力扣34:在排序数组中查找元素的第一个和最后一个位置
解答思路:
1)使用二分来做即可,这里需要跟下面一道题做区分,这道题属于是left = right有意义类型的二分,定义leftIndex和rightIndex,从题目分析,当leftIndex不符合的时候就可以直接返回-1,-1了。
2)这道题难度在于思考while的条件以及if里面的条件到底是什么
class Solution {public int[] searchRange(int[] nums, int target) {int leftIndex = search(nums,target);//如果找不到就返回-1,-1if(leftIndex >= nums.length || nums[leftIndex] != target){return new int[]{-1,-1};}//寻找右边界(找到第一个 >= target的索引)int rightIndex = search(nums,target + 1);return new int[]{leftIndex, rightIndex - 1};}public int search(int[] nums,int target){int len = nums.length;int l = 0,r = len-1;while(l <= r){int mid = l + (r-l>>1);if(nums[mid] >= target){r = mid - 1;}else{l = mid + 1;}}//最终right 会等于 leftreturn l;}
}
力扣704:704. 二分查找
解答思路:
1)本题是基础二分,搞清楚left = right时,nums[mid]有没有意义即可
class Solution {public int search(int[] nums, int target) {int len = nums.length;int l = 0,r = len - 1;while(l <= r){int mid = l + ((r - l) >> 1);if(nums[mid] > target){r = mid - 1;}else if(nums[mid] < target){l = mid + 1;}else{return mid;}}return -1;}
}