双非二本实习前的准备day8

学习目标:

每天2-3到简单sql(刷完即止),每天复习代码随想录上的题目2-3道算法(时间充足可以继续),背诵的八股的问题也在这里记录了

今日碎碎念:

1)今天任务:java基础八股(不贴出来了),集合源码,MySQL,Redis八股部分

3)目前简历修改完毕


力扣刷题

SQL

力扣1193:1193. 每月交易 I

解答思路:

1)看注释即可

java 复制代码
# 找出每年的每月,按每日期和国家分组
# 这里得用到日期函数DATE_FORMAT(trans_date, '%Y-%m'),可以把日期转换为指定格式
# 其余的就是按照题目提示来统计即可,使用之前学到的IF来判断
select 
        DATE_FORMAT(trans_date, '%Y-%m') as month,
        country,
        count(*) as trans_count,
        sum(if(state = 'approved',1,0)) as approved_count,
        sum(amount) as trans_total_amount,
        sum(IF(state = 'approved', amount, 0)) AS approved_total_amount
    from Transactions
    group by month,country

力扣1174:1174. 即时食物配送 II

解答思路:

1)这道题我的首要思路就是,找到首次订单,那么就是找到订单日期最早的,因此可以使用MIN

2)查出拥有首次订单的用户的id和订单日期后,将这个表作为子查询结果

3)我们最后也只需要用到子查询的这两个列,因此where in(表)肯定是少不了的

4)接下来就是判断是即时订单 ,还是计划订单即可

java 复制代码
# 首先得找到首次订单,即找到订单日期最早的
select 
    round(
        sum(order_date = customer_pref_delivery_date) * 100 / count(*) 
        ,2
    ) as immediate_percentage 
    from Delivery
    where (customer_id,order_date) in (
        select customer_id,MIN(order_date)
            from Delivery
            group by customer_id
        )

力扣550:550. 游戏玩法分析 IV

解答思路:

1)这道题的难点在于进行比例的计算,以及想到日期函数-->datediff函数的使用

2)去看评论区大神的即可

3)这里我就简单说两句:

3.1)这种解法只需要找到首次登录日期,因为首次登录一定是唯一的,所以找到了首次登录的用户id以及日期,其实就相当于找到了玩家的总数了,省去了又查一次表然后distinct这种操作。

3.2)接下来就是过滤数据,将查出来的首次登录表和Activity进行左连接,找到日期差为1的用户的数据,因为是左表连接查询,所以结果条数至少为左表条数;其实根本无需关心用户到底连续登录了几天,我只需要找到连续登录两天的数据即可。

3.3)因此,将首次登录表与Activity表连接查询是再好不过的过滤方法,过滤条件如下即可on p.player_id = a.player_id and datediff(a.event_date,p.login) = 1

3.4)最后一步就比较简单,如果找出来的天数是不连续的,那么结果就会显示为null,因此判断一下,是null就不计算即可

sql 复制代码
# 计算从首次登录日期开始至少连续两天登录的玩家的数量,然后除以玩家总数。
# 思考如何找出玩家总数
select 
        round(
            sum(if(a.event_date is not null, 1, 0)) / count(*)
        ,2) as fraction
    from 
        (
            select player_id,min(event_date) as login
                from Activity
                group by player_id
        )as p
    left join Activity as a
    on p.player_id = a.player_id and datediff(a.event_date,p.login) = 1

算法

力扣15:15. 三数之和

解答思路:

1)看注释即可

java 复制代码
class Solution {
    public List<List<Integer>> threeSum(int[] nums) {
        List<List<Integer>> result = new ArrayList<>();
        //排序
        Arrays.sort(nums);
        //开始找三元组
        for(int i = 0;i < nums.length;i++){
            //排序后是递增的数,如果三元组的第一个选数已经大于0了,说明没符合要求的
            if(nums[i] > 0){
                return result;
            }
            if (i > 0 && nums[i] == nums[i - 1]) {  
                // 去重a
                // 比如一个数组,-1,-1,0,1
                // 此时就需要这一步来去重
                continue;
            }
            //去找其余两个
            int left = i + 1;
            int right = nums.length-1;
            while(left < right){
                //求出当前三元组和
                int sum = nums[i] + nums[left] + nums[right];
                //如果和大于0,说明right指针需要往左移动,加一个小的数才可能让总和为0
                if(sum > 0){
                    right--;
                }
                //left同理
                else if(sum < 0){
                    left++;
                }
                //如果是为0,则记录
                else{
                    result.add(Arrays.asList(nums[i], nums[left], nums[right]));
                    // 记录完之后发现各自可能会跟附近产生重复的三元组,进行去重
                    // 去重逻辑应该放在找到一个三元组之后,对b 和 c去重
                    while (right > left && nums[right] == nums[right - 1]) right--;
                    while (right > left && nums[left] == nums[left + 1]) left++;
                    //指针移动,准备进入下一轮
                    right--; 
                    left++;
                }
            }
        }
        return result;
    }
}

力扣383:383. 赎金信

解答思路:

1)本题比较简单,哈希表来做即可

java 复制代码
class Solution {
    public boolean canConstruct(String ransomNote, String magazine) {
        // shortcut
        if (ransomNote.length() > magazine.length()) {
            return false;
        }
        int[] cnt = new int[26];
        for(int i = 0;i < magazine.length();i++){
            cnt[magazine.charAt(i) - 'a'] ++;
        }
        for(int i = 0;i<ransomNote.length();i++){
            int j = ransomNote.charAt(i) - 'a';
            cnt[j]--;
            if(cnt[j] < 0){
                return false;
            }
        }
        return true;
    }
}

八股

计算机网络

Java基础

1.String,StringBuffer和StringBuilder的区别

2.String为什么不可变

3.String类能被继承吗?为什么?

4.Integer和int的区别?为什么要设计封装类?

5.谈谈对hashCode和equals方法的理解,什么时候需要重新实现这俩方法,重写equals为什么要重写hashCode

MySQL

1.不可重复读和幻读有什么区别?

2.MVCC的实现原理?

3.什么是聚集索引和非聚集索引

Redis

1.什么是缓存击穿?缓存穿透?缓存雪崩?

2.如何确保缓存与数据库双写时的数据一致性

相关推荐
李永奉5 分钟前
C语言-嵌入式开发C语言常用预处理指令合集
c语言·开发语言
Sagittarius_A*28 分钟前
后量子密码|通识认知 03|量子威胁辟谣:Grover 算法对对称密码的影响与误区
算法·信息安全·密码学·量子计算·pqc·后量子密码
Patrick在香港33 分钟前
Python Docker镜像从1.2GB到89MB:多阶段构建的完整优化实录
java·python·docker·信息可视化·容器·数据分析·ai编程
上海安当技术1 小时前
敏感数据怎么防拖库?信封加密(DEK+KEK 二层密钥)架构设计与 Java 实战
java·开发语言·python
我是唐青枫1 小时前
Java JCommander 实战详解:用注解解析命令行参数
java·开发语言
大鹏说大话1 小时前
C++ 内存布局详解:类、虚函数、虚表底层原理
java·开发语言
键盘会跳舞1 小时前
C++:容器适配器 queue 的源码级拆解
开发语言·c++·queue
还是鼠鼠2 小时前
Spring AI连接DeepSeek与通义千问:application.yaml配置详解
java·通义千问·spring ai·deepseek
QAQo7T2 小时前
Python组蓝桥杯备赛超详细知识点总结笔记_排序算法篇
笔记·python·算法·蓝桥杯·排序算法
千里之行,始于足下sanhai2 小时前
P8686 [蓝桥杯 2019 省 A] 修改数组 - 数字魔法大冒险 题解
c++·算法·动态规划