ARTS第三周打卡

第三周

目录

前言:什么是ARTS打卡?

ARTS打卡是陈皓(网名左耳朵耗子)于2019年在专栏读者发起的打卡挑战,累计吸引4000+人参与,产出了很多优质的内容。2023年8月15日打卡重启,目的是为了聚集一波热爱技术的人,延续好奇、探索、实践、分享的精神。

Algorithm:一道算法题

题目链接:3061 – Subsequence (poj.org)
描述:尺取法求解最小区间
解答:根据题目可以得出求解此问题的最佳方法是双指针。首先它属于滑动窗口(即区间)问题,所以需要采用同向扫描的方法。其次,测试样例中给出了多组样本,我能想到的就是写好核心方法,然后去求解每一组样本。

核心判断逻辑:

  1. 区间之和C小于目标值S且第二指针没有走到头:求和并移动第二指针
  2. C大于等于S:比较出较小的区间长度,并移动第一指针
  3. 第二指针走到头:移动第一指针

注释:关于尺取法的相关知识,需要参考相关教材

代码(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:阅读一篇英文文章

文章链接:http://xhslink.com/dMVb3

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. 编程应该像文字一样优雅
– 与文字同源,都是思维的产物
– 可读性
– 编程的最高水平(信,达,雅 – 鲁棒性;可读性;代码风格)

  • 8
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值