Home avatar

东东东尼君

东尼君的世界

LeetCode算法进阶之路:从数据机构到算法思想的刷题笔记

算法能力是编程人员成长过程中不可绕过的基础能力。在实际工程开发中,我们更多面对的是业务问题、系统设计、架构演进以及工程实践,但有很多底层能力。例如:如何高效处理数据、如何设计合理的数据结构、如何优化程序复杂度——最终都会回归到数据结构与算法。从日常开发中的缓存设计,到高性能系统中的数据组织、搜索优化,再到人工智能和计算机视觉领域中的模型设计,算法思想始终贯穿其中。

过去的开发经历让我积累了一定的工程经验,也意识到掌握语言特性和框架使用,并不能代表真正具备扎实的软件工程能力。因此,开始重新系统学习数据结构与算法,并通过LeetCode作为主要练习平台,将每一道题的思考过程、算法思想以及实现方式记录下来。这篇文章将作为我的LeetCode刷题总记录,持续更新,Github同步记录。

C#中的nameof运算符

在日常 C# 开发中,我们经常需要获取变量名、属性名、方法名或类型名的字符串形式,比如:

  • 抛出参数异常时提示参数名
  • 日志记录字段名称
  • 数据绑定、反射、序列化
  • MVVM / ASP.NET 中的属性通知

在 C# 6.0 之前,这些字符串往往是硬编码的魔法字符串(Magic String),维护成本极高。而 nameof 的出现,几乎是一次“工程级”的体验升级。

Downloader源码剖析:一个下载器的实现原理

在开发日常工作中,文件下载看似是一个再普通不过的功能,但当下载规模扩大、速度需要优化、断点续传需要保证、并发控制需要精确、甚至要处理上百 GB 的大文件时,“下载器”就迅速从普通工具变成了一个考验系统设计能力的实战项目。Downloader 正是这样一个值得深入研究的优秀示例。它不仅实现了多线程下载、断点续传、分块合并、速度统计等核心功能,还在架构设计、并发模型、代码组织方式上体现了 C# 在现代并发场景下的最佳实践。对于正在学习 C# 并发编程、网络 IO、上位机开发的工程师来说,它几乎是一个“天然的进阶教材”。

编写可读代码的艺术 (Dustin Boswell / Trevor Foucher)

当我们看到写得很漂亮的代码时,会很受启发。好代码会告很明确告诉你它在做什么。使用它会很有趣,并且会鼓励你把自己的代码写得更好。该书旨在帮助你把代码写得更好。该书的关键思想是代码应该写得容易理解。确切地说,使别人用最短的时间理解你的代码。每一章都会深入编程的某个方面来讨论如何使代码更容易理解。 该书分为四个部分:

  • 表面层次上的改进:命名、注释以及审美——可以用于代码库每一行的小提示。
  • 简化循环和逻辑:在程序中定义循环、逻辑和变量,从而使得代码更容易理解。
  • 重新组织你的代码:在更高层次上组织大的代码块以及在功能层次上解决问题的方法。
  • 精选话题:把“易于理解”的思想应用于测试以及大数据结构代码的例子。

launch-editor源码剖析:快速打开编辑器的实现原理

在阅读 Vite 源码的过程中,我注意到一个有趣的依赖 —— launch-editor。起初只是随手点开,结果却发现它正是支撑起「浏览器报错信息 → 一键跳转到编辑器」这一开发体验的核心工具。其实,我们在使用 Vite、Vue CLI 等工具的时候,不止一次用过这个功能:报错时点击链接,代码编辑器立刻打开到对应的文件和行号。背后的关键实现,正是 launch-editor。

ES6模块使用指南

在前端开发的进化历程中,模块化 一直是一个核心问题。早期我们用全局变量、命名空间、立即执行函数(IIFE)来组织代码,但都存在依赖管理复杂、命名冲突等问题。 直到 ES6(ECMAScript 2015) 正式引入了 模块化语法,才为 JavaScript 带来了原生的模块方案。

如何解决 Node.js 中的 EMFILE 错误

在日常 Node.js 开发中,你有没有遇到过这样一个错误:

Error: EMFILE: too many open files

该错误通常出现在:批量文件操作、递归复制、日志处理等场景中。为什么会出现该错误?其实是因为在操作系统中每个进程最多可以同时打开一定数量的文件或 Socket, 而当打开的文件或 Socket 超过了这个限制时,就会出现“打开文件过多”的错误,导致程序突然崩溃。这种“打开文件过多”的问题看 似简单,但如果不加处理,尤其是在批量文件处理场景下,会让我们的 Node.js 程序非常脆弱。

如何查看PowerShell的版本

在使用 PowerShell 进行脚本开发或系统运维时,知道当前环境的 PowerShell 版本是非常有必要的。不同的版本在功能和兼容性上存在差异,有些模块或命令在旧版本中可能无法使用,甚至语法支持也会有变化。

本文将介绍多种查看 PowerShell 版本的方法,无论你是在使用 Windows PowerShell 5.1 还是跨平台的 PowerShell 7,都能轻松查到当前版本信息。

json-server源码剖析:快速构建REST API背后的原理

在前端开发中,构建一套完整的后端接口往往耗时费力,而 json-server正是为了解决这一痛点而生。只需一个 JSON 文件,它就能快速生成一个 REST API 服务,被广泛用于前端开发、原型验证、接口测试等场景。本文将深入剖析 json-server的源码,一起理解它是如何工作的,并从中学习一些开发技巧。

用PowerShell玩转文件处理

PowerShell 是一个功能强大的自动化脚本平台,不仅可以管理系统和服务,还可以轻松高效地处理各种文件操作。无论你是系统管理员、开发者,还是数据分析师,掌握 PowerShell 的文件处理能力都能让你的工作事半功倍。本文将带你系统性地了解如何用 PowerShell 玩转文件处理,从基础操作到进阶技巧,让你轻松驾驭文件的读取、修改、管理与批处理任务。

Orange'S 一个操作系统的实现 (于渊)

操作系统(Operating System)是现代计算机系统的核心,它管理着硬件资源,调度应用程序运行,并为用户提供友好的交互界面。尽管我们每天都在使用各种操作系统,如 Windows、Linux、macOS 等,但其背后的设计与实现却常常被视为复杂而深奥的技术领域。然而,实现一个简单的操作系统并非遥不可及。通过深入了解操作系统的基本原理——如进程管理、内存管理、文件系统和设备驱动,我们可以循序渐进地从零开始构建一个微型操作系统。这不仅能加深对计算机系统的理解,还能让你体验到亲手编写底层代码的乐趣。在这篇文章中,我们将从最基础的引导程序开始,逐步构建一个简单的操作系统雏形。

csv2 源码剖析:轻量级 CSV 处理的高效之道

纸上得来终觉浅,绝知此事要躬行。——陆游《冬夜读书示子聿》

csv2是一个轻量级 C++ 库,用于将 CSV 文件解析为 C++ 中的 STL 容器。该库的主要功能是高效地处理 CSV 数据,简化了处理 CSV 文件的代码编写过程。以下是它的主要特性:

  1. 简单易用:通过使用 STL 容器(如 std::vector 和 std::tuple),使得开发者能够轻松将 CSV 文件的内容转换为标准 C++ 数据结构。
  2. 依赖少:该库只有 C++17 标准库的依赖,因此不需要额外的第三方库。
  3. 高效解析:该库采用高效的解析机制,支持处理大型 CSV 文件。
  4. 轻量级:代码库很小,适用于嵌入式或对依赖库要求较高的项目。

R数据科学

在当今数据驱动的世界中,从大规模数据分析到精准预测模型,数据科学正在塑造我们的决策方式。而在众多数据科学工具中,R 凭借其强大的统计分析能力和丰富的社区资源,成为数据科学家和分析师的首选之一。那么,如何利用 R 优雅地解锁数据的潜力?让我们从基础开始,逐步探索 R 的神奇之处。

如何调试Vue项目

在开发 Vue 应用的过程中,调试是确保项目稳定性和高效性的关键步骤。无论是开发环境中的小问题,还是生产环境中的复杂 bug,合理的调试方法都能大大提升开发效率并减少错误发生的概率。本文将深入探讨 Vue 项目调试的常见技巧与工具,从基础的调试方法到进阶的技术方案,为开发者提供一个系统化的调试框架。通过合理的调试策略,开发者能够快速定位问题,并对症下药,确保项目的顺利进行。

学习JavaScript数据结构与算法 第3版 (Loiane Groner)

在计算机科学领域,数据结构和算法是开发高效程序的核心工具。无论你是初学者还是经验丰富的开发者,掌握这些概念都能帮助你构建更快、更稳定的应用程序。我们日常使用的软件,从搜索引擎到社交媒体,再到购物网站,无不依赖数据结构和算法的强大支持。一个好的数据结构可以优化存储和访问数据的方式,而高效的算法则可以显著提升任务的执行速度。