学习笔记 14 工具教程 2 报错分享 1 随笔 1 题目分享 5

因子下标聚合的扩展

题目描述 给你一个下标从 1 开始、长度为 n 的整数数组 nums。 对于 nums[i],如果 n 能够被 i 整除,也就是 n % i == 0,那么称它为一个特殊元素。 请返回所有特殊元素的平方和。(力扣 2778) 这是一道非常简单的题:枚举下标,判断是否为 n 的因子,是的话就把平方加到答案里。 class Solution { public: int sumOfSquares(vector<int>& nums) { int n = nums.size(); int ans = 0; for (int i = 1; i <= n; ++i) { if (n % i == 0) { ans += nums[i - 1] * nums[i - 1]; } } return ans; } }; 这里最容易出错的地方只有一个:题目下标从 1 开始,而 C++ 数组下标从 0 开始。因此判断用 i,取值用 nums[i - 1]。 这道题其实就三件事 说白了,就是下面三件事: 哪些位置要算? 这些位置怎么算? 数组变不变,要查几次? 原题的答案也很简单: 要算的位置:i 是 n 的因子; 算法:把 nums[i - 1] 的平方加起来; 查询:数组不变,只查一次。 后面说的“扩展”,就是把这三件事分别换一下,看看原来的代码还能不能用。 一、换个条件:不一定只看因子 1. 从“因子”改成“质因子” 比如题目改成:只有当 i 是 n 的质因子时,才把它加进答案。那怎么办?很简单,平方和不用改,只改前面的判断: ...

2026-10-12 · OC

最多的不重叠子字符串

题目 给你一个只包含小写字母的字符串 s,你需要找到 s 中最多数目的非空子字符串,满足如下条件: 这些字符串之间互不重叠。也就是说对于任意两个子字符串 s[i..j] 和 s[x..y],要么 j < x,要么 i > y。 如果一个子字符串包含字符 char,那么 s 中所有 char 字符都应该在这个子字符串中。 请你找到满足上述条件的最多子字符串数目。如果有多个解法有相同的子字符串数目,请返回这些子字符串总长度最小的一个解。可以证明最小总长度解是唯一的。 请注意,你可以以任意顺序返回最优解的子字符串。 题目分析 先把两个条件翻译成人话 条件 2 是最关键、也最容易被忽略的一句。 它说的是:你不能"只要一部分"。比如 s 里有三个 a,那么任何一个包含 a 的子串,必须把这三个 a 全部包进去。 这句话有一个很强的推论: 每个字符一旦被占用,它绑定的区间就被钉死了,只能往外扩,不能往里缩。 也就是说,“能选的区间"不是随便取的,而是由字符串本身唯一决定的。我们真正的自由度只剩一条:在这些固定区间里挑几个互不重叠的。 第一步:先看每个字符的"势力范围” 拿题目的例子说: s = "adefaddaccc" 下标 0 1 2 3 4 5 6 7 8 9 10 字符 a d e f a d d a c c c 先不管条件 2,只看"第一次出现"和"最后一次出现",得到每个字符的原始区间: ...

2026-09-21 · OC

Deepseek Harness 插件配置教程

DSH 插件安装教程 DSH 插件的安装主要有两种方式:从 npm 包安装和从 GitHub 仓库安装。两种方式的核心命令模板一致: dsh plugin --profile <profile名称> add <插件来源> 关于命令前缀:本教程所有命令以全局安装的 dsh 为准。npx 安装只需加前缀 npx @deepseek-ai/dsh;源码安装使用 pnpm exec dsh,并且需要先 cd 到你的 dsh 源码目录。三种方式安装的插件最终都存放在同一个数据目录 ~/.dsh 中,由 DSH 自动识别和加载。 关于 --profile: 网页端填 web(大多数用户使用这个) 桌面端填 desktop 两者 profile 独立,插件不互通。如果两端都想用同一个插件,需要分别为两个 profile 各安装一次。 建议:如果你还没有安装任何插件,可以先安装一个插件市场(见下文第一部分)。这样之后就能在 DSH 界面里直接浏览、搜索和一键安装其他插件,比手动查包名或 GitHub 地址方便得多。 一、插件市场(推荐先装) 插件市场本质上也是一个 DSH 插件。安装后,它会在 Web UI 的 设置 → 插件 里增加一个“插件市场”或 “Plugin Market” 的 Tab,让你可以直接在 DSH 界面内浏览、搜索、一键安装社区插件。 推荐安装:dsh-market dsh-market 是目前社区最主流、功能最完整的插件市场,被多个来源列为插件市场的首选入口。它持续收录 2300+ 插件且每日增长,支持中文搜索、分类过滤、星级排序、插件截图预览和评论区讨论。除此之外,它还提供主题一键安装与切换、配置备份还原(支持 WebDAV 和 GitHub Gist 同步)、插件更新检查、热禁用/启用等实用功能,且多数插件安装后刷新页面即可生效,无需重启。 ...

2026-09-10 · OC

Deepseek Harness 安装教程

这篇 DSH 教程主要面向所有对 AI 感兴趣的同学,不管你是零基础还是有一定经验,看完这篇教程,都能理解 DSH 是什么,以及如何安装使用 DSH。 一、DSH 是什么? DeepSeek Harness 是 DeepSeek 推出的自家 Agent,它有别于其他 Agent。“Harness” 在英文里的意思是"驾驭、控制、利用"。 可以把它理解为马具(Harness)的作用——套在它身上,让骑手(开发者)能够通过缰绳引导它按照特定的路线(指定的测试任务)奔跑,并记录它的速度(性能指标)。 Harness 的理念是: Agent = 模型 + Harness Harness 就是赋予模型"手脚",让模型能够真正地读取文件、运行命令、调用工具、管理上下文,并在真实环境中持续、自主地完成任务。 也可以换个角度理解:Harness 是把"大模型"和"考题(数据集)“强行绑在一起,自动跑完所有题目并算出分数的那个"答题卡读卡机”。 那么 Harness 和其他 Agent 有什么区别呢?拿 Claude Code 和 Codex 举例:这两个都是闭源的、开箱即用的成品;而 DSH 则更像是 Agent 界的"Android",它是开放的、可定制的。 特性 DSH Claude Code Codex 开源 ✅ 是 ❌ 否 ❌ 否 本地部署 ✅ 支持 ❌ 云端 ❌ 云端 自定义工具 ✅ 支持 ❌ 有限 ❌ 有限 适用场景 开发/测试/研究 编程辅助 编程辅助 所以 Harness 就像一个乐高套装,它有基础零件和说明书,你可以随意拼出任何你想要的 Agent,具有高度的个性化。 ...

2026-09-08 · OC

NumPy 速通:一篇文章串起 13 章核心知识

速通指南:把 NumPy 的 13 个核心章节浓缩成一条主线,全程用一个「全班 5 位同学 × 3 门课成绩表」串起来。看完就能直接上手处理 Excel 表格数据,深挖再看对应章节的独立文章。 NumPy 是什么? NumPy(Numerical Python)是 Python 科学计算的基础库,核心是 ndarray(N 维数组)对象。 用 Python 自带的列表处理大量数值时,又慢又占内存;而 ndarray 把同类型的元素紧密排列在连续内存中,运算速度能快几十倍。它是 Pandas、SciPy、scikit-learn、深度学习框架等几乎所有数据科学工具的底层基石。 想用 Python 做数据处理、机器学习,NumPy 是绕不开的第一步。 🎯 本篇主线案例:班主任手上有 5 位同学、3 门课(语文/数学/英语)的成绩单。接下来每一节,我们都用这同一份数据来演示——学完你会发现,13 个知识点其实是一套连贯的"成绩处理流水线"。 1. 创建数组 一切的起点:怎么创建各种 ndarray。 import numpy as np # 从列表创建:5 位同学 × 3 门课的成绩表(行=同学,列=语文/数学/英语) scores = np.array([[90, 80, 85], [60, 70, 65], [95, 88, 92], [72, 65, 78], [55, 60, 70]]) # 特殊数组 zeros = np.zeros((2, 3)) # 全 0 ones = np.ones((2, 3)) # 全 1 arange = np.arange(0, 10, 2) # 等差数列,输出: [0 2 4 6 8] linspace = np.linspace(0, 1, 5) # 等分,输出: [0. 0.25 0.5 0.75 1. ] ⚠️ 灵魂警告:Python 原生 int 是任意精度的,但 NumPy 数组默认用固定位宽的整数(64 位系统上一般是 int64)。当你把超大整数塞进数组,或者整型数组做除法时,结果可能静默溢出(32 位环境下尤其危险)。数据要精确、要算小数,请显式指定:np.array([...], dtype=np.float64)。 ...

2026-08-30 · OC

AI 使用的一些体验和想法

我这段时间使用 AI 的一些体验和想法 引言 目前各位同学对于 AI 应该都不陌生了,但是想要真正会使用 AI,我觉得我们还是都应该学习一下。 这篇文章我就想详细讲一讲我这段时间的 AI 使用体验,以及我对 AI 的一些期待,不同模型用下来有什么感受,还有一些关于 Agent 的想法。 可能有些地方会比较主观,毕竟这些都是我自己用下来的感受,大家就当作一个分享来看就好。 1. 错误的使用场景 你给出问题,AI 给出答案,Ctrl C 和 Ctrl V 一下,问题解决。 这是最典型的使用,也是最无脑的。 我常常会在学校里听到有人抱怨豆包这么"蠢",提交了好几次还是 WA,但是他们并没有自己去看问题到底在哪里,也没有想着自己找一找原因,更没有想一想这个代码为什么要这样写。 用 AI 没错,让它写代码也没错,可是不能没有思考地接受。还是得自己吸收,再加以利用。 我平时最常使用的就是 DeepSeek 的网页版,它可以解决一些不太复杂的题目,也可以回答日常生活中出现的问题。当我没有思路的时候,我也会找它帮我出谋划策。 写这篇文章的时候其实我也是这么做的。最开始我只是有这样一个想法:我想写一篇关于 AI 使用体验的文章,但是没有很具体的思路。我就把自己的想法告诉了 DS,它很快帮我列出了一份大致的思路,然后我继续补充、修改,最终才有了现在这篇文章。 举一个我在视频里面看到的例子。 当我们写一个最简单的"输入一个数字,判断这个数字在不在数组里面"的时候,你有什么思路? 第一步,定义数组。 第二步,从键盘输入一个数。 第三步,把这个数和数组里面的每一个元素一一比较,如果找到了,就输出 yes,没有就输出 no。 思路很简单吧? 假设你不知道怎么写代码,你完全可以把这几步先自己想好,然后让 AI 去完成每一步的代码。写完以后你再去看,为什么要这么写。 在你已经有思路的前提下,再去看代码其实会轻松很多。 假设你连 for 循环都不知道怎么写,那就直接问。问它为什么这样写,又比如这里为什么要用 break,为什么必须放在这里,不能放在大括号外面。 是吧,这样一来是不是就清楚很多了? 学习效率也会高很多。 这只是一个最简单的例子,我主要还是想告诉大家: 不要对 AI 直接索取答案。 2. 我关于 AI 的一些想法 对于我来说,最开始 AI 能生成一整套方案,甚至直接把代码写出来。它把原本写代码的时间,变成了构思提示词和反复验证的时间。 这个过程中,其实我也有一个从依赖到质疑的过程。 最开始是只有我把程序提交上去,出现报错以后,我才能发现问题。 ...

2026-08-12 · Guangheng Xiao,Zhonghui Wang

大于等于序列前缀和的最小缺失整数

题目描述 给你一个下标从 0 开始的整数数组 nums。 如果一个前缀 nums[0..i] 满足:对于 1 <= j <= i 的所有元素都有 nums[j] = nums[j - 1] + 1,那么我们称这个前缀是一个 顺序前缀。特殊情况是,只包含 nums[0] 的前缀(也就是 nums[0..0])也是一个 顺序前缀。 请你返回 nums 中没有出现过的 最小 整数 x,满足 x 大于等于 最长 顺序前缀的 和。(力扣 2996) 先别急着写代码,把题目看懂 这题考察的其实不是算法有多难,而是你读题读得够不够细。很多同学一上来就懵,觉得这不就是个"找缺失整数"吗?其实坑藏在"前缀"和"最长"这两个词里。 坑一:什么是"顺序前缀"?——必须从下标 0 开始 先看一个具体例子,比如输入: ums = [3, 4, 5, 1, 12, 14, 13] 很多人第一反应是:哎,12, 13, 14 不也是连续的(每个都比前一个大 1)吗?怎么最长顺序前缀不是它们? 这里就是最容易踩的坑! “前缀”(prefix)的定义,是从 nums[0] 开始、连续的一段。 前缀永远要从数组的第一个元素 nums[0] 出发: nums[0..0] = [3] nums[0..1] = [3, 4] nums[0..2] = [3, 4, 5] nums[0..3] = [3, 4, 5, 1] 而 12, 13, 14 虽然在数组里彼此连续,但它们不是从 nums[0] 开始的,所以它们根本不叫"前缀",直接被排除掉。 ...

2026-08-11 · OC

最小回文序列的排列 I

题目描述 给你一个回文字符串 s,返回它的按字典序最小的回文排列。 回文:从前往后和从后往前读都一样。 排列:字符串中所有字符的重排。 字典序:从第一个字符开始比,谁先小谁就小;前面对完都一样,短的更小。(力扣 3517) 解决方法 1. 常见的想法 把所有回文排列都列出来,排个序,取第一个?No,能解决,但是—— 给你二十个字符串让你全排列,你不崩溃,计算机也要崩溃了。暴力当然可解,前提是数据量够小。 2. 换个思路:只看一半 既然是回文,左右两半肯定一样,我们只关心一半就行。 那先统计每个字母出现了几次,一个循环搞定。 int cnt[26] = {0}; for (char c : s) cnt[c - 'a']++; // 遍历 s,把每个字符转成 0~25 的索引,计数 每个字符都至少出现两次?No——出现奇数次的字符只能有一个(它正好放正中间)。比如 ababa:a 出现 3 次,b 出现 2 次,拿一个 a 当中间,剩下两个 a 两个 b。 3. 拼出左半部分 把每个字符频次的一半按字母序拼起来,得到左半部分 half,顺便记下中间那个奇数字符。 string half; char mid = 0; for (int i = 0; i < 26; ++i) { half.append(cnt[i] / 2, 'a' + i); // 频次一半个 'a'+i 拼进 half if (cnt[i] % 2 == 1) mid = 'a' + i; // 奇数次的那个字符当中间 } 这样 half 天然就是字典序最小的左半部分。 4. 生成右半部分 把 half 反转就是右半部分,回文就拼成了。 string right = half; reverse(right.begin(), right.end()); if (mid) return half + mid + right; // 有中间字符 return half + right; // 没有中间字符 完整代码如下 #include <string> #include <algorithm> using namespace std; class Solution { public: string smallestPalindrome(string s) { int cnt[26] = {0}; for (char c : s) cnt[c - 'a']++; string half; char mid = 0; for (int i = 0; i < 26; ++i) { half.append(cnt[i] / 2, 'a' + i); if (cnt[i] % 2 == 1) mid = 'a' + i; } string right = half; reverse(right.begin(), right.end()); if (mid) return half + mid + right; return half + right; } };

2026-08-10 · OC

最小回文序列的排列 II

题目描述 这是上一篇《最小回文排列 I》的进阶版。上一篇只要最小的那个回文排列,这一篇要第 k 小的那个。 给你一个回文字符串 s 和一个整数 k,返回 s 的所有回文排列中按字典序第 k 小的那个;如果不存在第 k 个,返回空字符串 ""。 回文、排列、字典序这些概念上一篇讲过,不懂先去看上一篇,这里不重复了。(力扣 3518) 解决方法 1. 还是老套路:只看一半 上一篇说过,回文左右两半一样,所以问题就变成了——求半边串的第 k 个排列。这一步完全一样,不重复讲了。 但是!!上一篇只取最小那个,直接从小到大拼 half 就行。这一篇要第 k 个,那排序不能偷懒了,得自己动手算排列数。 所以核心难点就一个:怎么在不去重、不暴力全排列的情况下,算出"以某个字符开头一共有多少种排列"。 下面重点讲这个。 2. 统计频次 + 检查可行性(跟上一篇一样) 老规矩,先数每个字母出现几次,检查能不能构成回文(奇数次字符最多一个)。 vector<int> cnt(26, 0); for (char c : s) cnt[c - 'a']++; // 统计每个字符出现的次数 // 检查可行性:最多只能有一个字符出现奇数次 int oddCount = 0; char midChar = 0; for (int i = 0; i < 26; i++) { if (cnt[i] % 2 == 1) { oddCount++; midChar = 'a' + i; // 记录中间字符 } } if (oddCount > 1) return ""; // 超过一个奇数次,无法构成回文 3. 构建半边串的频次(跟上一篇一样) 回文 = 左半边 + (中间字符) + 左半边反转,所以只需要排列左半边。 vector<int> halfCnt(26, 0); // 半边串里每个字符出现的次数 int total = 0; for (int i = 0; i < 26; i++) { halfCnt[i] = cnt[i] / 2; // 每个字符取一半 total += halfCnt[i]; // 半边串的总长度 } 4. 排列数怎么算?(新知识,重点!) 现在要算:用这些字母(可能有重复)能排成多少种不同的串? ...

2026-08-10 · OC

vscode里面初次使用git报错

VS Code 初次使用 Git 出现:“Make sure you configure your “user.name” and “user.email” in git.” 1. 突然出现的拦截 很多刚开始接触编程或者刚换了新电脑的朋友,在 VS Code 里愉快地敲完代码,准备按下“提交(Commit)”按钮记录自己的伟大成果时,往往会猝不及防地遇到一个报错提示框,或者在输出面板看到类似下面这样的一段红字: Make sure you configure your "user.name" and "user.email" in git. 不用慌,这不是你的代码写错了,而是 Git 跟你“互不相识”。 2. 为什么会出现这个问题? git的核心机制就是知道你是谁、你在干嘛(版本控制器),所以当git不知道你的信息,他就没办法工作。 这时候就需要把你的信息输入给git. 3. 三步解决:告诉 Git 你是谁 解决这个问题非常简单,只需要两行命令。由于我们是在 VS Code 里写代码,整个过程完全不需要切出编辑器。 步骤一:唤出 VS Code 终端 在 VS Code 中,你可以通过快捷键 Ctrl` + \` (数字 1 左边的那个按键)快速打开底部集成终端;或者在顶部菜单栏选择“终端 (Terminal)” -> “新建终端 (New Terminal)”。 步骤二:输入配置命令 在终端的命令行窗口中,依次输入以下两行命令并回车: git config --global user.name "你的名字或昵称" git config --global user.email "你的邮箱@example.com" 💡 提示:这里的 --global 参数表示“全局配置”。也就是说,你只要在你的电脑上配置这一次,以后不管你在哪个文件夹建什么新项目,Git 都会默认使用这个身份。 如果没有global呢? 如果没有global就代表这个git的改变只能在当前仓库使用,如果下一次在其他仓库提交还是需要再次设置。所以一般为了方便使用,大多都直接用global。 ...

2026-07-24 · OC