现场面试题

1.sql

1.1 只保留学生的最新成绩

表student中记录学生的成绩信息, 要求只保留学生的最新一条成绩记录
在这里插入图片描述

传统方式

  1. 根据学生编号进行group by, 找到最新的一条记录(编号、时间)
  2. 根据编号和时间, 查询出记录的完整信息(id为2, 5, 6)
  3. 删除其余记录
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
)

在这里插入图片描述

通过联表查询, 解决嵌套

  1. 通过与自身表进行关联, 让同一个人的记录互相进行对比,
  2. 设置条件s1.time > s2.time, 且使用left join, 保证时间早的记录被归档在右侧
  3. 即使只有一条记录, 也会被s1.id != s2.id过滤
  4. 时间最晚的那条记录, 永远不会出现在右侧. 右侧都是对比下来, 时间更早的数据, 我们将它们的id排重
  5. 删除这些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 统计通话号码数

在这里插入图片描述

日期通话次数通话时长当天最早通话时间当天最晚通话时间平均通话时长通话号码数
  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

  1. 将rm和student关联, 得到一个结果集, 这个结果集中包含所有符合条件的数据
  2. 当使用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位的值

  1. 规律: n = (n-1) + (n-2)
  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);
    }
}

使用迭代的方式:

  1. 因为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;
}
  • 7
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值