思路:双指针思路可以吗,我就直接找G,如果后一个是1就cnt++,如果不是数字,用一个指针i指向G,另一个指针j移动,当不是G时停止,统计G的个数,如果是奇数个同时G的下一个是1,cnt++,如果为偶数同时G的下一个是1,就用那唯一一次机会G的国特抵消一次,cnt++,此后不再对偶数个G进行cnt++,同时把i移动到j指向G位置,就这样一直遍历字符串;- s = input()
- cnt = 0
- king_used = False
- i = 0
- while i < len(s):
- if s[i] == 'G':
- if i + 1 < len(s):
- if s[i + 1] == '1':
- cnt += 1
- i += 2
- continue
- elif s[i + 1] in ['2', '3']:
- i += 2
- continue
- else:
- j = i + 1
- while j < len(s) and s[j] == 'G':
- j += 1
- g_count = j - i
- if g_count % 2 == 1:
- cnt += 1
- elif g_count % 2 == 0 and not king_used:
- cnt += 1
- king_used = True
- i = j
- else:
- i += 1
- else:
- i += 1
- print(cnt)
- 转c++
复制代码 我不知道为啥我c++代码过不了,但是python嫩果
一、MySQL 基础语句
1. 数据库操作 创建数据库
- CREATE DATABASE school_db;
复制代码 删除数据库选择数据库2. 表操作 创建表
- CREATE TABLE students (
- student_id INT AUTO_INCREMENT PRIMARY KEY,
- name VARCHAR(50) NOT NULL,
- age INT,
- gender ENUM('男', '女'),
- enrollment_date DATE DEFAULT CURRENT_DATE
- );
复制代码 删除表修改表结构- ALTER TABLE students ADD COLUMN email VARCHAR(100);
- ALTER TABLE students MODIFY COLUMN age TINYINT;
- ALTER TABLE students DROP COLUMN gender;
复制代码 3. CRUD 操作
插入数据- INSERT INTO students (name, age, gender)
- VALUES ('张三', 18, '男'), ('李四', 19, '女');
复制代码 查询数据- -- 基本查询
- SELECT * FROM students;
- -- 条件查询
- SELECT name, age FROM students WHERE age > 18;
- -- 排序
- SELECT * FROM students ORDER BY age DESC;
- -- 分组
- SELECT gender, COUNT(*) FROM students GROUP BY gender;
- -- 分页
- SELECT * FROM students LIMIT 5 OFFSET 0; -- 第一页,每页5条
复制代码 更新数据- UPDATE students SET age = 20 WHERE name = '张三';
复制代码 删除数据- DELETE FROM students WHERE student_id = 1;
复制代码 二、外键与关联查询
1. 外键概念
外键(Foreign Key)用于建立表与表之间的关联关系,确保数据完整性。
2. 创建带外键的表
- -- 班级表
- CREATE TABLE classes (
- class_id INT AUTO_INCREMENT PRIMARY KEY,
- class_name VARCHAR(50) NOT NULL,
- teacher VARCHAR(50)
- );
- -- 学生表(带外键)
- CREATE TABLE students (
- student_id INT AUTO_INCREMENT PRIMARY KEY,
- name VARCHAR(50) NOT NULL,
- age INT,
- class_id INT,
- FOREIGN KEY (class_id) REFERENCES classes(class_id)
- ON DELETE SET NULL
- ON UPDATE CASCADE
- );
复制代码 3. 外键约束选项
: 主表记录删除时,从表相关记录自动删除: 主表记录删除时,从表外键设为NULL: 拒绝删除主表记录(默认): 主表主键更新时,从表外键同步更新
4. 关联查询
内连接(INNER JOIN)- SELECT s.name, s.age, c.class_name
- FROM students s
- INNER JOIN classes c ON s.class_id = c.class_id;
复制代码 左连接(LEFT JOIN)- SELECT s.name, c.class_name
- FROM students s
- LEFT JOIN classes c ON s.class_id = c.class_id;
复制代码 右连接(RIGHT JOIN)- SELECT s.name, c.class_name
- FROM students s
- RIGHT JOIN classes c ON s.class_id = c.class_id;
复制代码 全连接(FULL JOIN) - MySQL通过UNION实现- SELECT s.name, c.class_name FROM students s LEFT JOIN classes c ON s.class_id = c.class_id
- UNION
- SELECT s.name, c.class_name FROM students s RIGHT JOIN classes c ON s.class_id = c.class_id;
复制代码 三、完整示例
1. 创建数据库和表
- -- 创建数据库
- CREATE DATABASE school_management;
- USE school_management;
- -- 创建班级表
- CREATE TABLE classes (
- class_id INT AUTO_INCREMENT PRIMARY KEY,
- class_name VARCHAR(50) NOT NULL,
- teacher VARCHAR(50),
- created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
- );
- -- 创建学生表(带外键)
- CREATE TABLE students (
- student_id INT AUTO_INCREMENT PRIMARY KEY,
- name VARCHAR(50) NOT NULL,
- age INT CHECK (age BETWEEN 10 AND 30),
- gender ENUM('男', '女'),
- class_id INT,
- FOREIGN KEY (class_id) REFERENCES classes(class_id)
- ON DELETE SET NULL
- ON UPDATE CASCADE,
- created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
- );
- -- 创建成绩表(多外键)
- CREATE TABLE scores (
- score_id INT AUTO_INCREMENT PRIMARY KEY,
- student_id INT,
- subject VARCHAR(50),
- score DECIMAL(5,2),
- exam_date DATE,
- FOREIGN KEY (student_id) REFERENCES students(student_id)
- ON DELETE CASCADE
- ON UPDATE CASCADE
- );
复制代码 2. 插入测试数据
- -- 插入班级数据
- INSERT INTO classes (class_name, teacher) VALUES
- ('一年级一班', '王老师'),
- ('一年级二班', '李老师'),
- ('二年级一班', '张老师');
- -- 插入学生数据
- INSERT INTO students (name, age, gender, class_id) VALUES
- ('张三', 18, '男', 1),
- ('李四', 19, '女', 1),
- ('王五', 17, '男', 2),
- ('赵六', 20, '女', NULL);
- -- 插入成绩数据
- INSERT INTO scores (student_id, subject, score, exam_date) VALUES
- (1, '数学', 90.5, '2023-06-15'),
- (1, '语文', 85.0, '2023-06-16'),
- (2, '数学', 92.0, '2023-06-15'),
- (3, '英语', 88.5, '2023-06-17');
复制代码 3. 复杂查询示例
查询每个班级的学生人数- SELECT c.class_name, COUNT(s.student_id) AS student_count
- FROM classes c
- LEFT JOIN students s ON c.class_id = s.class_id
- GROUP BY c.class_id;
复制代码 查询学生及其班级和成绩(多表连接)- SELECT s.name, s.age, c.class_name, sc.subject, sc.score
- FROM students s
- LEFT JOIN classes c ON s.class_id = c.class_id
- LEFT JOIN scores sc ON s.student_id = sc.student_id
- ORDER BY s.name, sc.subject;
复制代码 查询平均分高于85的班级- SELECT c.class_name, AVG(sc.score) AS avg_score
- FROM classes c
- JOIN students s ON c.class_id = s.class_id
- JOIN scores sc ON s.student_id = sc.student_id
- GROUP BY c.class_id
- HAVING avg_score > 85;
复制代码 使用子查询- -- 查询没有参加任何考试的学生
- SELECT name FROM students
- WHERE student_id NOT IN (SELECT DISTINCT student_id FROM scores);
复制代码 四、外键管理
1. 查看外键约束
- SELECT
- TABLE_NAME, COLUMN_NAME, CONSTRAINT_NAME,
- REFERENCED_TABLE_NAME, REFERENCED_COLUMN_NAME
- FROM
- INFORMATION_SCHEMA.KEY_COLUMN_USAGE
- WHERE
- REFERENCED_TABLE_SCHEMA = 'school_management';
复制代码 2. 删除外键约束
- ALTER TABLE students DROP FOREIGN KEY students_ibfk_1;
复制代码 3. 添加外键约束
- ALTER TABLE students
- ADD CONSTRAINT fk_class
- FOREIGN KEY (class_id) REFERENCES classes(class_id)
- ON DELETE SET NULL
- ON UPDATE CASCADE;
复制代码 到此这篇关于mysql的基础语句和外键查询及其语句的文章就介绍到这了,更多相关mysql的基础语句和外键查询及其语句内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
来源:https://www.jb51.net/database/339465g1p.htm
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作! |