这里写目录标题
- 1.sql
- 1.1 只保留学生的最新成绩
- 1.2 统计通话号码数
- 1.3 更新地址
- 2.基础题
- 2.1 请求序列第N位的值: 0, 1, 1, 2, ,3, 5, 8, 13, 21, 34.....第N位的值
- 2.2 请写一段java代码,输出存在重复字母的单词
1.sql
1.1 只保留学生的最新成绩
表student中记录学生的成绩信息, 要求只保留学生的最新一条成绩记录
传统方式
- 根据学生编号进行group by, 找到最新的一条记录(编号、时间)
- 根据编号和时间, 查询出记录的完整信息(id为2, 5, 6)
- 删除其余记录
delete from student where id not in (
select id from student s1 inner join
(select `name`, max(time) as time from student group by `name`) s2
on s1.name = s2.name and s1.time = s2.time
)
通过联表查询, 解决嵌套
- 通过与自身表进行关联, 让同一个人的记录互相进行对比,
- 设置条件s1.time > s2.time, 且使用left join, 保证时间早的记录被归档在右侧
- 即使只有一条记录, 也会被s1.id != s2.id过滤
- 时间最晚的那条记录, 永远不会出现在右侧. 右侧都是对比下来, 时间更早的数据, 我们将它们的id排重
- 删除这些id
delete from student where id in (
select DISTINCT s2.id
from student s1 left join student s2
on s1.`no` = s2.`no` and s1.id != s2.id
where s1.time > s2.time
)
1.2 统计通话号码数
日期 | 通话次数 | 通话时长 | 当天最早通话时间 | 当天最晚通话时间 | 平均通话时长 | 通话号码数 |
---|---|---|---|---|---|---|
- 首先通过函数将时间转换为日期(年月日), 并基于日期进行分组
- 在分组的基础上, 对组中的通话号码进行去重, 得到通话号码数
select
DATE(begin_time) as date,
COUNT(1) as count,
SUM(cost) as sum,
MIN(begin_time) as min,
MAX(begin_time) as max,
AVG(cost) as avg,
COUNT(DISTINCT number) as number
from tel_record
group by DATE(begin_time)
1.3 更新地址
根据no将报名表(bm)中的地址全部替换为学生表(student)中的地址, 写出对应的sql
- 将rm和student关联, 得到一个结果集, 这个结果集中包含所有符合条件的数据
- 当使用UPDATE语句与INNER JOIN一起操作时, 实际上是直接修改了目标表中符合连接条件的行
UPDATE bm
INNER JOIN student ON bm.no = student.no
SET bm.address = student.address;
2.基础题
2.1 请求序列第N位的值: 0, 1, 1, 2, ,3, 5, 8, 13, 21, 34…第N位的值
- 规律: n = (n-1) + (n-2)
- 递归的退出条件: n=0时值为0, n=1时值为1
public static void main(String[] args) {
System.out.println(get(10));
}
private static int get(int n) {
if (n <= 1) {
// 退出条件
return n;
} else {
// 递归
return get(n - 1) + get(n - 2);
}
}
使用迭代的方式:
- 因为n为0和1时, 没有办法找到规律, 所以直接返回对应的值
private static int get(int n) {
if (n <= 1) {
return n;
}
// 上一个
int prev = 0;
// 当前
int curr = 1;
for (int i = 2; i <= n; i++) {
int temp = curr;
curr = prev + curr;
prev = temp;
}
return curr;
}
2.2 请写一段java代码,输出存在重复字母的单词
public static void main(String[] args) {
String[] words = {"spring", "mybatis", "springboot", "vocation", "birthday", "username"};
for (String word : words) {
if (hasDuplicateLetters(word)) {
System.out.println(word + " 存在重复字母");
}
}
}
private static boolean hasDuplicateLetters(String word) {
HashSet<Character> set = new HashSet<>();
for (char ch : word.toCharArray()) {
if (!set.add(ch)) {
return true; // 如果添加失败,说明该字母已经存在于集合中,存在重复字母
}
}
return false;
}