第三周
目录
前言:什么是ARTS打卡?
ARTS打卡是陈皓(网名左耳朵耗子)于2019年在专栏读者发起的打卡挑战,累计吸引4000+人参与,产出了很多优质的内容。2023年8月15日打卡重启,目的是为了聚集一波热爱技术的人,延续好奇、探索、实践、分享的精神。
Algorithm:一道算法题
题目链接:3061 – Subsequence (poj.org)
描述:尺取法求解最小区间
解答:根据题目可以得出求解此问题的最佳方法是双指针。首先它属于滑动窗口(即区间)问题,所以需要采用同向扫描的方法。其次,测试样例中给出了多组样本,我能想到的就是写好核心方法,然后去求解每一组样本。
核心判断逻辑:
- 区间之和C小于目标值S且第二指针没有走到头:求和并移动第二指针
- C大于等于S:比较出较小的区间长度,并移动第一指针
- 第二指针走到头:移动第一指针
注释:关于尺取法的相关知识,需要参考相关教材
代码(Java语言):
package team.cbx.POJpriactice;
import java.util.Scanner;
public class Practice3061 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int caseNum = Integer.parseInt(sc.nextLine());
String[] strings = new String[caseNum * 2];
for (int i = 0; i < caseNum * 2; i++) {
strings[i] = sc.nextLine();
}
for (int i = 0; i < caseNum; i++) {
String[] split1 = strings[i * 2].split(" ");
int N = Integer.parseInt(split1[0]);
int S = Integer.parseInt(split1[1]);
String[] split2 = strings[i * 2 + 1].split(" ");
int count = Integer.parseInt(split2[0]);
int minLength = N + 1;
for (int j = 0, k = 1; count > 0 && j < N; ) {
if (count < S && k < N) {
count += Integer.parseInt(split2[k++]);
} else if (count >= S) {
minLength = Math.min(minLength, k - j);
count -= Integer.parseInt(split2[j++]);
} else {
j++;
}
}
if (minLength == N + 1) {
System.out.println(0);
} else {
System.out.println(minLength);
}
}
}
}
Review:阅读一篇英文文章
Tips:分享一个小技术
问题场景:在hibernatedao调用订单编号(比如"SJ-140")查询到实体后,换个类似的编号(“SJ-156”)再次查询,查询到的还是那个订单实体,但是编号变成了"SJ-156"。
解决办法:每次查询前,清空当前session,再次查询实体,问题消失。
最后得到的解释:
GPT4:
你遇到的这个问题是Hibernate中非常典型的一级缓存(Session缓存)的工作机制所导致的。在Hibernate中,一级缓存是Session级别的缓存,它默认是开启的。其工作机制如下:
1. 查询实体:当你使用Hibernate查询一个实体时,比如通过一个订单编号,Hibernate会首先检查当前Session的一级缓存中是否已经存在该实体的缓存。如果存在,Hibernate会直接从缓存中返回该实体,而不会执行SQL查询数据库。
2. 缓存中的实体:如果Session中没有缓存该实体,Hibernate会执行SQL查询,将查询结果放入一级缓存,并返回给你。
3. 缓存的影响:如果在同一个Session中,你再次用不同的订单编号查询相同的订单实体,即使编号不同,Hibernate依然会从一级缓存中返回之前查询过的实体。因为Hibernate认为在一个Session的生命周期内,实体的状态不会变化,除非你明确进行了更新操作。
4. 清空缓存:当你在查询前清空了Session(例如通过`session.clear()`或`session.evict(entity)`),一级缓存中的所有实体都会被清除。此时,如果你执行查询,Hibernate将不得不再次执行SQL查询数据库,因此你会得到最新的实体数据,这也就是你采取的解决办法。
5. 为何发生这种现象:这种现象发生是因为Hibernate的一级缓存默认假设,除非Session关闭或者清空,否则缓存中的实体在整个Session期间是不会变化的。这种设计主要是为了减少数据库的查询次数,提高应用的性能。
总结起来,你遇到的这种现象是由于Hibernate的一级缓存导致的,这是一个设计上的取舍,它在减少数据库访问次数和保持Session内实体状态一致性之间寻求平衡。清空Session缓存的方法有效地解决了这个问题,因为它强制Hibernate对每次查询都去数据库中检索最新的数据。
Share:表达一个观点:
观点:编程是一种输出思想的形式,应该像数学一样严谨,像文字一样优雅。
1. 编程是经过逻辑训练后的一种具体表达。
– 离散数学基础(比如谓词和量词)是前置条件
– 语言的结构化表达是表现形式
– 软件是连接现实与计算机的桥梁
2. 编程应该像数学一样严谨
– 起源于数学,但应用高于数学
– 链式思维
– 编程范式与设计模式的水平共同决定了个人的代码逻辑
– 编程是服务于实际的,一定要能解决问题
3. 编程应该像文字一样优雅
– 与文字同源,都是思维的产物
– 可读性
– 编程的最高水平(信,达,雅 – 鲁棒性;可读性;代码风格)