leecodecode【面试150】【2026.6.18打卡-java版本】

有效的括号

要点:括号匹配,栈

java 复制代码
class Solution {
    public boolean isValid(String s) {
        //栈,push.pop
        if(s == null || s.length() == 0){
                return true;
        }
        Deque<Character> stack = new ArrayDeque<>();

        for(char c : s.toCharArray()){
            if(c == '('  || c =='{' || c =='['){
                stack.push(c);
            }else{
                if(stack.isEmpty()){
                    return false;
                }

                char temp = stack.peek();
                if(c == ')' && temp == '(' ){
                    stack.pop();
                }else if(c == '}' && temp =='{'){
                    stack.pop();
                }else if(c == ']' && temp == '['){
                    stack.pop();
                }else{
                    stack.push(c);
                }
            }
        }

        return stack.isEmpty();
        
    }
}

简化路径

要点:栈,主要是把题目意思理清楚

java 复制代码
class Solution {
    public String simplifyPath(String path) {
        List<String> stk = new ArrayList<>();
        for (String s : path.split("/")) {
            if (s.isEmpty() || s.equals(".")) {
                continue;
            }
            if (!s.equals("..")) {
                stk.add(s);
            } else if (!stk.isEmpty()) {
                stk.removeLast(); // stk.remove(stk.size() - 1);
            }
        }
        return "/" + String.join("/", stk);
    }
}

随机知识

Transformer 的 Self-Attention(自注意力)机制是整个模型的基石。它的本质是**"全局信息聚合"**:让序列中的每个词,都能直接"看到"并融合所有其他词的信息。

你提到的 Q×K → Softmax → 加权 V 是绝对核心的计算主线。为了让你理解透彻,我将严格遵循矩阵运算的维度变换,分三个阶段拆解(附带完整数学公式):

前置准备:输入与投影

假设输入序列长度为 LL,每个词的嵌入维度为 dmodeldmodel​。

  1. 输入矩阵 XX:形状为 (L,dmodel)(L,dmodel​)。

  2. 通过三个可训练权重矩阵 WQ,WK,WVWQ​,WK​,WV​ 进行线性投影,生成:

    • Q(查询) :Q=XWQQ=XWQ​,形状 (L,dk)(L,dk​)。(代表"我想找什么")

    • K(键) :K=XWKK=XWK​,形状 (L,dk)(L,dk​)。(代表"我有什么索引")

    • V(值) :V=XWVV=XWV​,形状 (L,dv)(L,dv​)。(代表"我实际携带的内容")

      (通常 dk=dvdk​=dv​,且为了多头方便,常设为 dmodel/headsdmodel​/heads)


第一阶段:Q × K(计算相似度得分矩阵)

这一步是为了计算序列中任意两个位置之间的关联强度

  • 运算:QQ 与 KK 的转置做矩阵乘法,即 Scores=Q⋅KTScores=Q⋅KT。

  • 维度变化:(L,dk)×(dk,L)=(L,L)(L,dk​)×(dk​,L)=(L,L)。

  • 物理含义 :结果矩阵中,第 ii 行第 jj 列的数值,代表第 ii 个位置的 Query 与第 jj 个位置的 Key 的点积。点积值越大,表示这两个位置在向量空间中的夹角越小,关联度越高


第二阶段:缩放(Scale)与 Softmax(归一化为概率权重)

原始点积值可能非常大(尤其在维度 dkdk​ 较大时),这会使得 Softmax 的梯度进入极小的饱和区,导致训练困难。因此需要先"降温和稳定梯度"。

  • 缩放运算:Scaled_Scores=Q⋅KTdkScaled_Scores=dk​​Q⋅KT​。(除以 dkdk​​ 使得方差稳定在 1 左右)

  • Softmax 归一化 :对矩阵的每一行(即针对当前查询词)应用 Softmax。

    Attention_Weights=softmax(QKTdk)Attention_Weights=softmax(dkQKT)

  • 维度不变:仍为 (L,L)(L,L)。

  • 物理含义 :此时矩阵的每一行都是概率分布,且和为 1。这意味着对于位置 ii 来说,它对序列中所有位置(包括自己)的"关注度"百分比


第三阶段:加权 V(聚合信息输出)

拿到注意力权重矩阵后,用它去提取 Value 中的实际语义信息。

  • 运算:将权重矩阵与 VV 相乘,即 Output=Attention_Weights⋅VOutput=Attention_Weights⋅V。

  • 维度变化:(L,L)×(L,dv)=(L,dv)(L,L)×(L,dv​)=(L,dv​)。

  • 物理含义 :对于位置 ii,新输出的向量 = ∑j(注意力权重i,j×Vj)∑j​(注意力权重i,j​×Vj​)。这相当于将序列中所有位置的 Value 按"相似度比例"混合在一起,形成当前位置融合了全局信息的最终上下文向量。


完整数学公式(最终形态)

将上述三步合并,即经典论文中的标准公式:

Attention(Q,K,V)=softmax(QKTdk)VAttention(Q,K,V)=softmax(dk​​QKT​)V


深度细节补充(易错点)

  1. 为什么用 KTKT 而不是 KK:为了保证输出的注意力矩阵是方阵 (L×L)(L×L),使得每个词都能对应一个关于所有词的概率分布。

  2. 掩码(Mask)在哪介入 :在 Softmax 之前,解码器(Decoder)会将未来位置的得分设为 −∞−∞,这样 Softmax 后概率趋近于 0,从而保证"不能看到未来信息"。

  3. 多头机制(Multi-Head):上述过程会并行执行 hh 次(多组不同的 WQ,WK,WVWQ​,WK​,WV​),得到多个 (L,dv)(L,dv​) 输出,最后拼接并过线性层。目的是让模型从不同语义子空间捕捉关联。

碎碎念:后续会更新每天学习的八股和算法 题,开始准备秋招的第39天。努力连续更新100天!以后每天就按,秋招项目【java +agent】,科研,必做项目,算法,八股,锻炼身体来总结。

总结:aicoding一整天

1.算法面试150 75/150【早中晚】 30min

2.秋招项目,【java 项目】,【修改,1h】

【agent 项目 】,【x修改,1h】

3.科研要跑一下,无

4.检测项目,准备数据集【4h】

6.背八股,无

7.锻炼身体,【1h】

反思:晚上没学习,玩了一晚上,每天开始背背背!!