zoukankan      html  css  js  c++  java
  • Mysql与sql语句

    Mysql与sql语句

     

    一.数据库

    复制代码
    //1.创建数据库
        create database [if not exists] db_name [character set xxx] [collate xxx]
        *创建一个名称为mydb1的数据库。
        create database mydb1;
        *创建一个使用utf8字符集的mydb2数据库。
        create database mydb2 character set utf8;
        *创建一个使用utf8字符集,并带校对规则的mydb3数据库。
        create database mydb3 character set utf8 collate utf8_bin ;
    //2.查看数据库
        show databases;查看所有数据库
        show create database db_name; 查看数据库的创建方式
    //3.修改数据库
        alter database db_name [character set xxx] [collate xxxx]
    //4.删除数据库
        drop database [if exists] db_name;
    //5.使用数据库
        切换数据库 use db_name; //注意:进入到某个数据库后没办法再退回之前状态,但可以通过use进行切换
        查看当前使用的数据库 select database();
    复制代码

    二.表

    复制代码
    //1.创建表
            create table tab_name(
            field1 type,
            field2 type,
            ...
            fieldn type
            )[character set xxx][collate xxx];
    
           //****python和mysql的数据类型比较******
               str ---------------------- char(n) varchar(n) (5.0版本:255  更高:65535)
               int float -----------------tinyint smallint int bigint float double
               boolean ------------------ bit 0/1
               Date ----------------------Date、Time、DateTime、timestamp
               大数据----------------------Blob(大二进制,比如电影,音乐) Text(大文本,比如大于65535字节的小说)
    
             //创建一个员工表employee
             create table employee(
                id int primary key auto_increment ,
                name varchar(20),
                gender bit default 1,   //gender char(1)  default 1,
                birthday date,
                entry_date date,
                job varchar(20),
                salary double,
                resume text    //注意,这里作为最后一个字段不加逗号
              );
    
        //约束:
           primary key (非空且唯一)  :能够唯一区分出当前记录的字段称为主键!
           unique
           not null
           auto_increment 主键字段必须是数字类型。
           外键约束
    //2.查看表信息
        desc tab_name 查看表结构
        show tables 查看当前数据库中的所有的表
        show create table tab_name    查看当前数据库表建表语句 
    //3.修改表结构
       (1)增加一列
          alter table tab_name add [column] 列名 类型;
       (2)修改一列类型
          alter table tab_name modify 列名 类型;
       (3)修改列名
          alter table tab_name change [column] 列名 新列名 类型;
       (4)删除一列
          alter table tab_name drop [column] 列名;
       (5)修改表名
          rename table 表名 to 新表名;
       (6)修该表所用的字符集    
          alter table student character set utf8;
    //4.删除表
        drop table tab_name;
    复制代码

    三.表记录

    复制代码
    三、表记录
    
        //1.增加一条记录insert
    
            insert into tab_name (field1,filed2,.......) values (value1,value2,.......);
                //插入的数据应与字段的数据类型相同。
                //数据的大小应在列的规定范围内,例如:不能将一个长度为80的字符串加入到长度为40的列中。
                //在values中列出的数据位置必须与被加入的列的排列位置相对应。
                //字符和日期型数据应包含在单引号中'zhang' '2013-04-20'
                //插入空值:不指定某列的值或insert into table value(null),则该列取空值。
                //如果要插入所有字段可以省写列列表,直接按表中字段顺序写值列表insert into tab_name values(//value1,value2,......);
            
            //练习:使用insert语句向表中插入三个员工的信息。
    
                   insert into employee (name,birthday,entry_date,job,salary) values 
                   ('alex','1990-09-09','2000-01-01','CTO',9999);
    
                   insert into employee (name,birthday,entry_date,job,salary) values
                   ('alvin','1989-08-08','2000-01-01','teacher',9999);
    
                   insert into employee (name,birthday,entry_date,job,salary) values 
                   ('xialv','1991-07-07','2000-01-02','保安',888);
    
                   insert into employee values (7,'wusir',1,'1970-05-05','2001-01-01','保安',1000,null);
    
        //2.修改表记录 
                update tab_name set field1=value1,field2=value2,......[where 语句]
                UPDATE语法可以用新值更新原有表行中的各列。
                SET子句指示要修改哪些列和要给予哪些值。
                WHERE子句指定应更新哪些行。如没有WHERE子句,则更新所有的行。
                //实验:
                    //将所有员工薪水修改为5000元。
                    update emp set salary=5000;
                    //将姓名为’zs’的员工薪水修改为3000元。
                    update emp set salary=3000 where name='zs';
                    //将姓名为’ls’的员工薪水修改为4000元,job改为ccc。
                    update emp set salary=4000,job='ccc' where name='zs';
                    //将wu的薪水在原有基础上增加1000元。    
                    update emp set salar=salary+4000 where name='wu';
                    
        //3.删除表操作
    
                delete from tab_name [where ....]
                如果不跟where语句则删除整张表中的数据
                delete只能用来删除一行记录,不能只删除一行记录中的某一列值(这是update操作)。
                delete语句只能删除表中的内容,不能删除表本身,想要删除表,用drop
                同insert和update一样,从一个表中删除记录将引起其它表的参照完整性问题,在修改数据库数据时,头脑中
                应该始终不要忘记这个潜在的问题。
                TRUNCATE TABLE也可以删除表中的所有数据,词语句首先摧毁表,再新建表。此种方式删除的数据不能在
                事务中恢复。
                //实验:
                    //删除表中名称为’zs’的记录。
                    delete from emp where name='黄忠';
                    //删除表中所有记录。
                    delete from emp;
                    //使用truncate删除表中记录。
                    truncate table emp;
                        
        //4.select操作
    
            (1)select [distinct] *|field1,field2,......   from tab_name 
                其中from指定从哪张表筛选,*表示查找所有列,也可以指定一个列列表明确指定要查找的列,distinct用来剔除重复行。
                        //练习:
                        //查询表中所有学生的信息。
                        select * from exam;
                        //查询表中所有学生的姓名和对应的英语成绩。
                        select name,english from exam;
                        //过滤表中重复数据。
                        select distinct english from exam;
            (2)select 也可以使用表达式,并且可以使用 as 别名
    
                        //练习:
                        //在所有学生分数上加10分特长分显示。
                        select name,english+10,chinese+10,math+10 from exam;
                        //统计每个学生的总分。
                        select name,english+chinese+math from exam;
                        //使用别名表示学生总分。
                        select name,english+chinese+math as 总成绩 from exam;
                        select name,english+chinese+math 总成绩 from exam;
                        select name english from exam; //what will happen?---->记得加逗号
            (3)使用where子句,进行过滤查询。
    
                         //练习:
                        //查询姓名为XXX的学生成绩
                        select * from exam where name='张飞';
                        //查询英语成绩大于90分的同学
                        select name,english from exam where english>90;
                        //查询总分大于200分的所有同学
                        select name,math+english+chinese as 总成绩 from exam where math+english+chinese>200 ;
                        //where字句中可以使用:
                                //比较运算符:    
                                    > < >= <= <>  
                                    between 10 and 20 值在10到20之间  
                                    in(10,20,3)值是10或20或30
                                    like '张pattern' 
                                    pattern可以是%或者_,
    如果是%则表示任意多字符,此例中张三丰 张飞 张abcd,如果是_则表示一个字符张_,张飞符合。张Is null //逻辑运算符 在多个条件直接可以使用逻辑运算符 and or not //练习 //查询英语分数在 80-100之间的同学。 select name ,english from exam where english between 80 and 100; //查询数学分数为75,76,77的同学。 select name ,math from exam where math in (75,76,77); //查询所有姓张的学生成绩。 select * from exam where name like '张%'; //查询数学分>70,语文分>80的同学。 select name from exam where math>70 and chinese >80; //查找缺考数学的学生的姓名 select name from exam where math is null; (4)Order by 指定排序的列,排序的列即可是表中的列名,也可以是select 语句后指定的别名。 //select *|field1,field2... from tab_name order by field [Asc|Desc] // Asc 升序、Desc 降序,其中asc为默认值 ORDER BY 子句应位于SELECT语句的结尾。 //练习: //对数学成绩排序后输出。 select * from exam order by math; //对总分排序按从高到低的顺序输出 select name ,(ifnull(math,0)+ifnull(chinese,0)+ifnull(english,0)) 总成绩 from exam order by 总成绩 desc; //对姓张的学生成绩排序输出 select name ,(ifnull(math,0)+ifnull(chinese,0)+ifnull(english,0)) 总成绩 from exam where name like '张%' order by 总成绩 desc; (5)聚合函数:技巧,先不要管聚合函数要干嘛,先把要求的内容查出来再包上聚合函数即可。 count(列名):统计行的个数 //统计一个班级共有多少学生?先查出所有的学生,再用count包上 select count(*) from exam; //统计数学成绩大于70的学生有多少个? select count(math) from exam where math>70; //统计总分大于250的人数有多少? select count(name) from exam where (ifnull(math,0)+ifnull(chinese,0)+ifnull(english,0))>250; sum(列名):统计满足条件的行的内容和 //统计一个班级数学总成绩?先查出所有的数学成绩,再用sum包上 select sum(math) from exam; //统计一个班级语文、英语、数学各科的总成绩 select sum(math),sum(english),sum(chinese) from exam; //统计一个班级语文、英语、数学的成绩总和 select sum(ifnull(math,0)+ifnull(chinese,0)+ifnull(english,0)) as 总成绩 from exam; //统计一个班级语文成绩平均分 select sum(chinese)/count(*) from exam ; //注意:sum仅对数值起作用,否则会报错。 AVG(列名): //求一个班级数学平均分?先查出所有的数学分,然后用avg包上。 select avg(ifnull(math,0)) from exam; //求一个班级总分平均分 select avg((ifnull(math,0)+ifnull(chinese,0)+ifnull(english,0))) from exam ; Max、Min //求班级最高分和最低分(数值范围在统计中特别有用) select Max((ifnull(math,0)+ifnull(chinese,0)+ifnull(english,0))) from exam; select Min((ifnull(math,0)+ifnull(chinese,0)+ifnull(english,0))) from exam; 注意:null 和所有的数计算都是null,所以需要用ifnull将null转换为0! (6)group by 分组查询: group by字句,其后可以接多个列名,也可以跟having子句对group by 的结果进行筛选。 //练习:对订单表中商品归类后,显示每一类商品的总价 select product,sum(price) from orders group by product; //练习:查询购买了几类商品,并且每类总价大于100的商品 select product,sum(price) from orders group by product having sum(price)>100; //!!! having 和 where两者都可以对查询结果进行进一步的过滤,差别有: <1>where语句只能用在分组之前的筛选,having可以用在分组之后的筛选; <2>使用where语句的地方都可以用having进行替换 <3>having中可以用聚合函数,where中就不行。 //练习:查询商品列表中除了橘子以外的商品,每一类商品的总价格大于500元的商品的名字 select product,sum(price) from orders where product<>'桔子' group by product having sum(price)>500; (7) //重点:Select from where group by having order by Mysql在执行sql语句时的执行顺序:from where select group by having order by //分析: select math+english+chinese as 总成绩 from exam where 总成绩 >250; ---- 不成功 select math+english+chinese as 总成绩 from exam having 总成绩 >250; --- 成功 select math+english+chinese as 总成绩 from exam group by 总成绩 having 总成绩 >250; ----成功 select math+english+chinese as 总成绩 from exam order by 总成绩;----成功 select * from exam as 成绩 where 成绩.math>85; ---- 成功
    复制代码

    四.约束

    复制代码
    1.创建表时指定约束:
        create table tb(
        id int primary key auto_increment,
        name varchar(20) unique not null,
        ref_id int,
        foreign key(ref_id) references tb2(id)
        );
    
        create table tb2(
        id int primary key auto_increment
        );
        
    2.外键约束:
        //(1)增加外键:
        可以明确指定外键的名称,如果不指定外键的名称,mysql会自动为你创建一个外键名称。
        RESTRICT : 只要本表格里面有指向主表的数据, 在主表里面就无法删除相关记录。
        CASCADE : 如果在foreign key 所指向的那个表里面删除一条记录,那么在此表里面的跟那个key一样的所有记录都会一同删掉。
        alter table book add [constraint FK_BOOK] foreign key(pubid) references pub_com(id) [on delete restrict] [on update restrict]
        //(2)删除外键
        alter table 表名 drop foreign key 外键(区分大小写,外键名可以desc 表名查看);
    
    
    3.主键约束:
        //(1)增加主键(自动增长,只有主键可以自动增长)
        Alter table tb add primary key(id) [auto_increment];
        //(2)删除主键
        alter table 表名 drop primary key
        //(3)增加自动增长
        Alter table employee modify id int auto_increment;
        //(4)删除自动增长
        Alter table tb modify id int;
    复制代码

    五.多表设计与查询

    复制代码
    设计:
        一对一(311教室和20130405班级,两方都是一):在任意一方保存另一方的主键
        一对多、多对一(班级和学生,其中班级为1,学生为多):在多的一方保存一的一方的主键(思考why?)
        多对多(教师和学生,两方都是多):使用中间表,保存对应关系
    
    
    --------------------------------------------------------------------------------------------------
    多表查询:
            create table tb (id int primary key,name varchar(20) );
            create table ta (
                    id int primary key,
                    name varchar(20),
                    tb_id int
                                            );
            insert into tb values(1,'财务部');
            insert into tb values(2,'人事部');
            insert into tb values(3,'科技部');
            
            insert into ta values (1,'刘备',1);
            insert into ta values (2,'关羽',2);
            insert into ta values (3,'张飞',3);
            
            
            mysql> select * from ta;
                +----+------+-------+
                | id | name | tb_id |
                +----+------+-------+
                |  1 | aaa  |     1 |
                |  2 | bbb  |     2 |
                |  3 | bbb  |     4 |
                +----+------+-------+
            mysql> select * from tb;
                +----+------+
                | id | name |
                +----+------+
                |  1 | xxx  |
                |  2 | yyy  |
                |  3 | yyy  |
                +----+------+
        
            1.笛卡尔积查询:两张表中一条一条对应的记录,m条记录和n条记录查询,最后得到m*n条记录,其中很多错误数据
                select * from ta ,tb;
            
                mysql> select * from ta ,tb;
                    +----+------+-------+----+------+
                    | id | name | tb_id | id | name |
                    +----+------+-------+----+------+
                    |  1 | aaa  |     1 |  1 | xxx  |
                    |  2 | bbb  |     2 |  1 | xxx  |
                    |  3 | bbb  |     4 |  1 | xxx  |
                    |  1 | aaa  |     1 |  2 | yyy  |
                    |  2 | bbb  |     2 |  2 | yyy  |
                    |  3 | bbb  |     4 |  2 | yyy  |
                    |  1 | aaa  |     1 |  3 | yyy  |
                    |  2 | bbb  |     2 |  3 | yyy  |
                    |  3 | bbb  |     4 |  3 | yyy  |
                    +----+------+-------+----+------+
            2.内连接:查询两张表中都有的关联数据,相当于利用条件从笛卡尔积结果中筛选出了正确的结果。
                select * from ta ,tb where ta.tb_id = tb.id;
                select * from ta inner join tb on ta.tb_id = tb.id;
            
                mysql> select * from ta inner join tb on ta.tb_id = tb.id;
                    +----+------+-------+----+------+
                    | id | name | tb_id | id | name |
                    +----+------+-------+----+------+
                    |  1 | aaa  |     1 |  1 | xxx  |
                    |  2 | bbb  |     2 |  2 | yyy  |
                    +----+------+-------+----+------+
            3.外连接
                (1)左外连接:在内连接的基础上增加左边有右边没有的结果
                select * from ta left join tb on ta.tb_id = tb.id;
                
                mysql> select * from ta left join tb on ta.tb_id = tb.id;
                    +----+------+-------+------+------+
                    | id | name | tb_id | id   | name |
                    +----+------+-------+------+------+
                    |  1 | aaa  |     1 |    1 | xxx  |
                    |  2 | bbb  |     2 |    2 | yyy  |
                    |  3 | bbb  |     4 | NULL | NULL |
                    +----+------+-------+------+------+
                (2)右外连接:在内连接的基础上增加右边有左边没有的结果
                    select * from ta right join tb on ta.tb_id = tb.id;
                    
                    mysql> select * from ta right join tb on ta.tb_id = tb.id;
                    +------+------+-------+----+------+
                    | id   | name | tb_id | id | name |
                    +------+------+-------+----+------+
                    |    1 | aaa  |     1 |  1 | xxx  |
                    |    2 | bbb  |     2 |  2 | yyy  |
                    | NULL | NULL |  NULL |  3 | yyy  |
                    +------+------+-------+----+------+
                    
                (3)全外连接:在内连接的基础上增加左边有右边没有的和右边有左边没有的结果
                    select * from ta full join tb on ta.tb_id = tb.id; --mysql不支持全外连接
                    select * from ta left join tb on ta.tb_id = tb.id 
                    union
                    select * from ta right join tb on ta.tb_id = tb.id;
                    
                    mysql> select * from ta left join tb on ta.tb_id = tb.id
                        -> union
                        -> select * from ta right join tb on ta.tb_id = tb.id; --mysql可以使用此种方式间接实现全外连接
                    +------+------+-------+------+------+
                    | id   | name | tb_id | id   | name |
                    +------+------+-------+------+------+
                    |    1 | aaa  |     1 |    1 | xxx  |
                    |    2 | bbb  |     2 |    2 | yyy  |
                    |    3 | bbb  |     4 | NULL | NULL |
                    | NULL | NULL |  NULL |    3 | yyy  |
                    +------+------+-------+------+------+
    复制代码

     六.事务

    复制代码
    一、事务
    
    //1.事务的概念:事务是指逻辑上的一组操作,这组操作要么同时完成要么同时不完成。参考转账操作。
          update account set money=money-100 where name=‘a’; 
          update account set money=money+100 where name=‘b’;
    
    //2.如果你自己不去控制事务,数据库默认一条sql语句就处在自己单独的事务当中。
    
    //3.也可以使用命令去开启一个事务:
    
            start transaction;--开启事务,这条语句之后的sql语句将处在一个事务当中,这些sql语句并不会立即执行
            Commit--提交事务,一旦提交事务,事务中的所有sql语句才会执行。
            Rollback -- 回滚事务,将之前所有的sql取消。
            
            conn.setAutoCommit(false);
            conn.commit();
            conn.rollback();
            conn.setSavePoint();
            conn.rollback(sp);
    
    //4.事务的特性(ACID)
            原子性(Atomicity):  原子性是指事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生。
    
            一致性(Consistency):事务前后数据的完整性必须保持一致。在事务执行之前数据库是符合数据完整性约束的,
                                 无论事务是否执行成功,事务结束后的数据库中的数据也应该是符合完整性约束的。
                                 在某一时间点,如果数据库中的所有记录都能保证满足当前数据库中的所有约束,则可以
                                 说当前的数据库是符合数据完整性约束的。
    
            隔离性(Isolation):  事务的隔离性是指多个用户并发访问数据库时,一个用户的事务不能被其它用户的事务所
                                 干扰,多个并发事务之间数据要相互隔离。
    
            持久性(Durability): 持久性是指一个事务一旦被提交,它对数据库中数据的改变就是永久性的,接下来即使数
                                 据库发生故障也不应该对其有任何影响。
    
    //5.隔离性
        将数据库设计为串行化程的数据库,让一张表在同一时间内只能有一个线程来操作。如果将数据库设计为这样,那数据库的
        小率也太低了。所以数据库的设计这没有直接将数据库设计为串行化,而是为数据库提供多个隔离级别选项,使数据库的使
        用者可以根据使用情况自己定义到底需要什么样的隔离级别。
            
        //不考虑隔离性可能出现的问题:
        //脏读:一个事务读取到了另一个事务未提交的数据,这是特别危险的,要尽力防止。
            a 1000
            b 1000
            a:
                start transaction;
                update set money=money+100 where name=b;
            b:
                start transaction;
                select * from account where name=b;--1100
                commit;
            a:
                rollback;
            b:start transaction;
                select * from account where name=b;--1000
        //不可重复读:在一个事务内读取表中的某一行数据,多次读取结果不同。(一个事务读取到了另一个事务已经提交的数据--
                    增加记录、删除记录、修改记录),在某写情况下并不是问题,在另一些情况下就是问题。
            a:start transaction;
                select 活期账户 from account where name=b;--1000    活期账户:1000
                select 定期账户 from account where name=b;--1000   定期账户:1000
                select 固定资产 from account where name=b;--1000  固定资产:1000
                ------------------------------
                b:
                    start transaction;
                    update set money=0 where name=b;
                    commit;
                ------------------------------
                select 活期+定期+固定 from account where name=b; --2000 总资产: 2000
        //虚读(幻读)
            是指在一个事务内读取到了别的事务插入的数据,导致前后读取不一致。(一个事务读取到了另一个事务已经提交的数据---
            增加记录、删除记录),在某写情况下并不是问题,在另一些情况下就是问题。
    
                b 1000
                c 2000
                d 3000
            a:start transaction
                select sum(money) from account;---3000       3000
                -------------------
                    d:start transaction;
                        insert into account values(d,3000);
                        commit;
                -------------------
                select count(*)from account;---3                         3
                3000/3 = 1000                                            1000   
            
        //四个隔离级别:
            Serializable:可避免脏读、不可重复读、虚读情况的发生。(串行化)
            Repeatable read:可避免脏读、不可重复读情况的发生。(可重复读)不可以避免虚读
            Read committed:可避免脏读情况发生(读已提交)
            Read uncommitted:最低级别,以上情况均无法保证。(读未提交)
            
            安全性考虑:Serializable>Repeatable read>Read committed>Read uncommitted
            数据库效率:Read uncommitted>Read committed>Repeatable read>Serializable
            
            一般情况下,我们会使用Repeatable read、Read committed
            mysql数据库默认的数据库隔离级别Repeatable read
        
        //mysql中设置数据库的隔离级别语句:
            如何查询当前数据库的隔离级别?select @@tx_isolation;
            如何设置当前数据库的隔离级别?set [global/session] transaction isolation level ...;
          ~此种方式设置的隔离级别只对当前连接起作用。
            set transaction isolation level read uncommitted;
            set session transaction isolation level read uncommitted;
          ~此种方式设置的隔离级别是设置数据库默认的隔离级别    
            set global transaction isolation level read uncommitted;
        
    //8.数据库锁的机制:
        共享锁:共享锁可以和共享锁共存,不能和排他锁共存。
        排他锁:和任意锁都不共存。
        mysql:
            在非串行化的模式下,数据库在进行查询时不加任何锁。在进行修改记录时会加排他锁。
            在串行话模式下,数据库在进行查询时加共享锁,在进行修改是加排他锁。
        串行化是依赖锁来工作的。
        
        死锁:如果两头互相等,mysql会自动帮我们停止一个事务,错误退出,而将另一个执行掉。
        
        更新丢失:多线操作数据,在同一个查询结果的基础上进行修改,在进行提交,后提交的数据会将先提交的数据中的修改覆盖掉,造成更新数据丢失掉。
        Serializable本身就能防止更新丢失问题。Serializable效率太低下。
        
    //9.更新丢失
        如果多个线程操作,基于同一个查询结构对表中的记录进行修改,那么后修改的记录将会覆盖前面修改的记录,前面的修改就丢失
        掉了,这就叫做更新丢失。
        Serializable可以防止更新丢失问题的发生。其他的三个隔离级别都有可能发生更新丢失问题。
        Serializable虽然可以防止更新丢失,但是效率太低,通常数据库不会用这个隔离级别,所以我们需要其他的机制来防止更新丢失:
        
        //乐观锁和悲观锁不是数据库中真正存在的锁,只是人们在解决更新丢失时的不同的解决方案,体现的是人们看待事务的态度。
        //悲观锁:
            隔离级别不设置为Serializable,防止效率过低。
            在查询时手动加上排他锁。
                select * from table lock in share mode(读锁、共享锁)
                select * from table for update (写锁、排它锁)
            如果数据库中的数据查询比较多而更新比较少的话,悲观锁将会导致效率低下。
            
        //乐观锁:
            在表中增加一个version字段,在更新数据库记录是将version加一,从而在修改数据时通过检查版本号是否改变判断出当
            前更新基于的查询是否已经是过时的版本。
            如果数据库中数据的修改比较多,更新失败的次数会比较多,程序需要多次重复执行更新操作。
    
        //结论:
            如果当前的这个表查询比较多而修改比较少,则应该使用乐观锁。
            如果当前的这个表修改比较多而查询比较少,则应该使用悲观锁。
            很多情况下,更新丢失根本就不是问题,所以在现实开发中往往不考虑此问题,只有在对数据要求非常严格的情况下要解决更新丢失。
                
    
            
    复制代码
  • 相关阅读:
    Code Forces 650 C Table Compression(并查集)
    Code Forces 645B Mischievous Mess Makers
    POJ 3735 Training little cats(矩阵快速幂)
    POJ 3233 Matrix Power Series(矩阵快速幂)
    PAT 1026 Table Tennis (30)
    ZOJ 3609 Modular Inverse
    Java实现 LeetCode 746 使用最小花费爬楼梯(递推)
    Java实现 LeetCode 745 前缀和后缀搜索(使用Hash代替字典树)
    Java实现 LeetCode 745 前缀和后缀搜索(使用Hash代替字典树)
    Java实现 LeetCode 745 前缀和后缀搜索(使用Hash代替字典树)
  • 原文地址:https://www.cnblogs.com/xc1234/p/8601390.html
Copyright © 2011-2022 走看看