1月28日报

MySQL

存储过程

格式化日期: %Y 四位数年,%M 英语月份,%D日期

DELIMITER //

CREATE PROCEDURE formate_date(IN day1 DATE, OUT result VARCHAR(50))
       BEGIN
            SELECT DATE_FORMAT(day1, "%Y年%M月%D日") INTO result;
       END  //
DELIMITER;

调用存储过程: 关键是要加SET, 然后变量前加@

SET @day1 = '1992-08-09';
CALL formate_date(@day1, @res);

SELECT @res

删除存储过程/表

drop function/procedure if exists (namexxxx)

存储函数的构建:输入部门名字,得出部门的平均工资

DELIMITER //

CREATE FUNCTION dept_sal(iname VARCHAR(30))
RETURNS INT
DETERMINISTIC 
CONTAINS SQL
BEGIN
    RETURN (
    
    SELECT AVG(e.salary) 
    FROM employees e JOIN departments d
    ON e.department_id = d.department_id
    WHERE d.department_name = iname
    );
END //
DELIMITER;

面向对象

可以不用static直接呼出方法:

新建一个这个class(比如Solution s = new Solution()),然后用这个class内置的方法(比如s.func(xx))

面向对象的内存解析
运行时的数据区:

  • Heap, 存放对象实例
  • Stack,存储局部变量
  • Method Area, 方法区,存储已经被VM加载的类信息、常量、静态变量、即时编译器编译后的代码

变量

属性(局部变量)vs 成员变量
局部变量在新建时有默认值,但是成员变量没有,也不能在前面加修饰词

强制转移
int 向下取整
Math.random() 从[0, 1)

算法

并查集优化

QuickFind
QuickUnion

权重,根据权重去Union,权重小的root被加到权重大的上。

// To do;

贪心

1217 玩筹码

在这里插入图片描述
分两步

  1. 把奇数和偶数都放到1和0,这就是贪心,每一步都取最优解,即cost = 0
  2. 再1和0中取个最小值
class Solution {
    public int minCostToMoveChips(int[] position) {
        int odd = 0, even = 0;
        for (int n: position) {
            if (n % 2 == 0) {
                even++;
            } else {
                odd++;
            }
        }
        return Math.min(odd, even);
    }
}
55 Jump Game

最主要看的不是它怎么到,不是一个一个的去枚举,而是直接算当前这个数能到达的范围。

class Solution {
    public boolean canJump(int[] nums) {
        if (nums.length == 1) {
            return true;
        }
        
        int coverRange = 0;
        for (int i = 0; i <= coverRange; i++) {
            coverRange = Math.max(coverRange, i + nums[i]);
            /* i + nums[i] 即为当前的数从当前出发能到达的范围,比如num[0] = 3, 那么
            从nums[0]出发,最远就能到num[3].
            */
            if (coverRange >= nums.length - 1) {
                return true;
            }
        }

        return false;
    }
}
记忆搜索 Memorization

保存已经计算过的值,然后再下一次搜索中如果碰到这个值可以直接调用
比如斐波那契数列中的构建array就比递归快。同理,这道零钱兑换,也比递归快
如果是用递归,加一个count去数,每一次就是 amount-count,那就会空间超时

  • 322 零钱兑换

Input: coins = [1,2,5], amount = 11
Output: 3
Explanation: 11 = 5 + 5 + 1

class Solution {

    private int[] bucket;

    public int coinChange(int[] coins, int amount) {
        if (amount == 0) {
            return 0;
        } else if (coins.length == 0) {
            return -1;
        }

        bucket = new int[amount];

        return getMinCount(coins, amount);
    }

    private int getMinCount(int[] coins, int amount) {
        if (amount < 0) {
            return -1;
        } else if (amount == 0) {
            return 0;
        }

        //记忆化处理就是储存进一个数组
        if (bucket[amount - 1] != 0) {
            return bucket[amount - 1];
        }

        int min = Integer.MAX_VALUE;
        for (int i = 0; i < coins.length; i++) {
            int coin = coins[i];
            // 剩余的amount里最小能拿出来的次数
            int restMinCount = getMinCount(coins, amount - coin);
            if (restMinCount >= 0 && restMinCount < min) {
                min = restMinCount + 1;
                // 这个加1,就是加上现在拿的这一次
            }
        }

        //在这个amount上,比如说amount = 8,那么Index就是7,在这个数组的位置上储存最小的能取到的值.
        //如果是MAX_VALUE,那么证明拿不到想要的target,即是-1.
        bucket[amount - 1] = (min == Integer.MAX_VALUE ? -1 : min);
        return bucket[amount - 1]; 
    }
}
动态规划

动态规划的要点即是找规律:从初始状态,到最终结果,中间需要有一个过程的产生,所以最主要的就是摸清楚这个产生这个过程的方程或者函数。
这不同路径这题里面就是

上面的格的个数 + 右面的格的个数 = 当前这个格能到达的路径数

  • 62 不同路径
    在这里插入图片描述
class Solution {
    public int uniquePaths(int m, int n) {
        int[][] grid = new int[m][n];

        for (int i = 0; i < m; i++) {
            grid[i][0] = 1;
        }

        for (int i = 0; i < n; i++) {
            grid[0][i] = 1;
        }

        for (int i = 1; i < m; i++) {
            for (int j = 1; j < n; j++) {
                grid[i][j] = grid[i-1][j] + grid[i][j-1];
            }
        }

        return grid[m-1][n-1];
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 这个错误通常是由于MySQL8的默认身份验证插件已更改为caching_sha2_password所导致的。该插件要求使用SSL连接并且不允许从服务器获取公钥。 要解决此问题,您可以尝试以下几种方法: 1. 更改MySQL用户的身份验证插件为mysql_native_password 您可以使用以下命令更改MySQL用户的身份验证插件: ``` ALTER USER 'your_username'@'localhost' IDENTIFIED WITH mysql_native_password BY 'your_password'; ``` 这将更改身份验证插件为mysql_native_password,并且应该允许您连接到MySQL服务器。 2. 在连接字符串中指定允许PublicKeyRetrieval 在连接MySQL服务器时,您可以在连接字符串中指定允许PublicKeyRetrieval: ``` jdbc:mysql://localhost:3306/dbname?allowPublicKeyRetrieval=true&useSSL=false ``` 3. 将MySQL服务器配置为允许公钥检索 您可以在MySQL服务器的配置文件my.cnf中设置以下选项: ``` [mysqld] ... default_authentication_plugin=mysql_native_password ... ``` 这将将默认身份验证插件更改为mysql_native_password,并且应该允许公钥检索。 注意:如果您更改了MySQL用户的身份验证插件或服务器的默认身份验证插件,则可能需要重新启动MySQL服务器才能使更改生效。 ### 回答2: MySQL8报Public Key Retrieval is not allowed这个错误通常是由于MySQL8的更改引起的。在MySQL8中,不再支持通过旧的密码验证协议进行远程连接。这意味着在连接到MySQL8数据库时,不再允许从服务器检索公钥。 要解决此问题,您可以尝试以下方法: 1. 使用新的密码验证协议进行连接:在连接到MySQL8数据库时,您需要使用新的密码验证协议。可以通过在连接字符串(connection string)中指定“useSSL=false”来禁用SSL连接,或者使用新的SSL配置文件进行连接。 2. 更新MySQL JDBC驱动程序:如果您使用的是MySQL JDBC驱动程序进行连接,可能需要更新到最新的版本。最新的驱动程序通常会修复一些已知的问题和错误。 3. 检查MySQL服务器的配置:确保MySQL服务器的配置正确。如果配置文件中禁用了公钥检索功能,则可能需要启用它。您可以查阅MySQL的官方文档或向系统管理员寻求帮助。 尽管上面的方法可能会解决问题,但如果出现其他问题或错误,最好还是参考MySQL的官方文档或寻求专业人士的帮助。 ### 回答3: MySQL8报错"Public Key Retrieval is not allowed"的原因是由于MySQL8的新特性中启用了Caching SHA-2 Pluggable Authentication(Caching SHA-2可插拔身份验证),该特性要求在连接数据库时进行公钥检索,而默认情况下,MySQL Server未开启公钥插件与客户端进行认证所需的功能。 解决该问题的方法是修改MySQL配置文件my.cnf,在[mysqld]部分添加或修改以下行: ``` [mysqld] … default_authentication_plugin=mysql_native_password … ``` 然后重启MySQL服务,该错误应该就会解决。 另外,也可以通过更改mysql用户的认证插件来解决问题。首先,以root用户连接到MySQL数据库,然后运行以下命令: ``` ALTER USER 'mysql用户名'@'localhost' IDENTIFIED WITH mysql_native_password BY '密码'; ``` 请将"mysql用户名"替换为您要更改的实际用户名,将"密码"替换为用户的实际密码。运行该命令后,再次尝试连接数据库,应该能够成功连接,而不再报错。 这些解决方法适用于大多数情况,但如果问题仍然存在,可能需要查看MySQL的错误日志文件以获取更多详细信息,并可能需要根据具体情况进行其他操作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值