# DataStructuresAndAlgorithms **Repository Path**: Ruemo/data-structures-and-algorithms ## Basic Information - **Project Name**: DataStructuresAndAlgorithms - **Description**: 左程云算法系列课程 C#/java - **Primary Language**: C# - **License**: GPL-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 2 - **Forks**: 0 - **Created**: 2024-09-11 - **Last Updated**: 2026-02-17 ## Categories & Tags **Categories**: Uncategorized **Tags**: 数据结构与算法, Java, Csharp ## README # 自述文件 ## 前言 网上关于C#的数据结构教学比较少,仓库的内容是根据左程云老师2021年结课的[体系学习班](https://www.bilibili.com/list/ml3257668072)和大厂刷题班课程内的Java代码转写的C#代码。推荐大学期间想提升数据结构和算法的且**基础较好**的同学可以跟左老师的课程学习,提升很快。如果在Unity开发岗想提升数据结构和算法水平的话,也是不错的选择。学算法重要的是逻辑,与语言的关系不大。[视频资源](https://pan.baidu.com/s/1QwERVsglDi-B9M7pmjg5Ow?pwd=hhbb) ## 运行环境 课程学习阶段:推荐使用JetBrains Rider 2023.1.3和.Net SDK7及以上版本,可以直接点击每个类的Run函数行号的旁边的运行按钮即可,非常方便。(好消息2024年底Rider对个人开发者免费了) 动手练习阶段:推荐使用不安装插件或者禁用代码补全插件的VSCode、记事本或者Vim。在一口气写完之后启用粘贴到Rider中运行结果。可以快速提升编码能力。 ## 仓库代码结构 * **Ruemo's Algorithm Note**文件夹:目前是体系学习班笔记 * **java代码.zip**文件:大厂刷题班和体系学习班原版Java代码 ## 注意事项 1. **目前体系学习班的代码已经整理完成** 2. 由于C#与Java的语言差异需要说明关于两种语言之间的大致的类型替代: | Java类型 | C#类型 | 注意事项 | | :-------: | :------------: | :------- | | HashMap | Dictionary | 访问时使用TryGetValue避免异常 | | HashSet | HashSet | 注意Add()返回值含义 | | ArrayList | List | 直接对应 | | TreeMap | SortedDictionary | 缺少floorKey/ceiling方法,需自定义实现 | 详细转换问题和解决方案请参考:[Java到C#转换常见错误总结](./doc/Java到C#转换常见错误总结.md) 2. 关于新版.Net的一些语法糖 * 声明类型Node? a;表示a为可空的Node类型。 * 对于C#的矩阵数组比如 int[,] a;获取函数使用a.GetLength(维度),获取行数维度为0,获取列数维度为1 * **重要**:int[][]是锯齿数组,int[,]是真正的二维数组,不要混淆使用GetLength() * cur=cur?.next 等价于 if(cur!=null) cur=cur?.next * cur?? throw new Exception; 等价于如果当前指针为空那么抛出异常 * 构造函数的语法糖:可以将集合的成员直接在构造时天机 * 使用[模式匹配](https://learn.microsoft.com/zh-cn/dotnet/csharp/fundamentals/functional/pattern-matching)进行判断:cur{ lchild is not null , rchild is not null}表示cur左右子节点都不为空的条件表达式 * C#也有类似Python的切片语法:比如arr\[^1\]表示arr的倒数第一个元素 * 集合的Floor函数可以使用[LINQ](https://learn.microsoft.com/zh-cn/dotnet/csharp/linq/get-started/introduction-to-linq-queries)代替(可能性能稍差) * 更多语法糖可以查阅微软的官方文档,这些以上语法都是在Rider的默认配置下提示的改进写法 3. 其他需要注意的就是C#的比较器与Java比较器的区别 ## 推荐的学习方法 ### 1. 利用STT文档高效学习 项目中提供了课程内容的STT(Speech to Text),位于`doc`目录下。这些文档是课程的完整文字转录,具有以下优势: - **快速浏览**:视频内容大多在2小时左右,通过STT文档可以在10-15分钟内快速了解课堂内容 - **精准定位**:使用搜索功能快速找到特定知识点或代码的解释 - **AI辅助理解**:可以将STT文档提供给IDE的编程助手或其他AI工具,让AI了解课程的实际内容,便于理解具体的代码实现 - **复习利器**:不需要重新观看视频即可快速回顾课程要点 ### 2. 结合AI工具的使用技巧 将STT文档与AI工具结合使用可以大幅提升学习效率: **场景一:代码理解** - 当遇到难以理解的算法实现时,将相关STT片段和代码一起提交给AI - AI会结合课堂讲解内容,提供更准确的解释 **场景二:快速入门** - 在学习新算法前,先阅读对应的STT文档了解基本概念 - 再配合视频观看重点部分,节省时间 **场景三:问题排查** - 代码调试时,将STT文档作为上下文提供给AI - AI能根据课堂讲解内容,更准确地指出问题所在 ### 3. 推荐的学习流程 1. **预习阶段**(15-20分钟) - 阅读对应Lesson的STT文档 - 了解将要学习的主要知识点和算法 2. **学习阶段**(1-2小时) - 观看视频课程,重点关注STT文档中标记的关键内容 - 跟随视频在Rider中运行和调试代码 3. **实践阶段**(30-60分钟) - 关闭代码补全功能,在VSCode或记事本中重新实现算法 - 运行测试验证正确性 4. **复习阶段**(10分钟) - 再次浏览STT文档,巩固关键概念 - 整理笔记,记录易错点和技巧 ### 4. 学习建议 - **不要过度依赖STT**:STT是辅助工具,视频中的动画演示和老师的手写代码过程仍然很重要 - **循序渐进**:每个Lesson的内容都比较密集,建议每天学习1-2个Lesson - **多做笔记**:在STT文档中添加自己的理解和注释 - **定期复习**:使用STT文档定期回顾之前学过的内容,加深记忆 - **结合实践**:理论学习和动手实践相结合,代码实现才是掌握算法的关键 ### 5. AI辅助工具:Claude Code技能 项目配置了自定义的Claude Code技能(Skills),可以帮助你更高效地学习和优化笔记。 #### 可用技能 | 技能名称 | 功能描述 | 使用示例 | |---------|---------|-------------------------------------| | **note-review** | 评估学习笔记质量,对照STT文档和代码实现提供详细改进建议 | `/note-review 评估 体系学习班笔记/EPxx.md` | | **note-optimize** | 优化笔记结构,参照EP01.md模板生成规范化笔记,自动添加Mermaid图表 | `/note-optimize 结合之前的评估结果,优化 体系学习班笔记/EPxx.md` | > **提示**:技能文件位于 `.claude/skills/` 目录下,你可以根据需要自定义或扩展功能。 ## 快速参考 * **[Java到C#转换常见错误总结](./doc/Java到C#转换常见错误总结.md)** ### 编译和运行 ```bash # 编译整个解决方案 dotnet build # 运行特定项目 dotnet run --project 大厂刷题班/大厂刷题班.csproj dotnet run --project 体系学习班/体系学习班.csproj ``` ## 课程内容 参看仓库内的[视频内容位置说明](./doc/视频内容位置说明.md)文件 ## 其他说明 1.出现项目中代码与笔记中代码不一致的情况:项目中的代码是对Java代码的转写,笔记中给出的代码更符合C#的API或者编码习惯。 ## 文件链接 [体系学习班待办](./doc/体系学习班待办.md) [大厂刷题班待办](./doc/大厂刷题班待办.md) [Java到C#转换常见错误总结](./doc/Java到C#转换常见错误总结.md)