通过 archinstall 安装 Arch Linux
通过 archinstall 安装 Arch Linux 适用读者:对 Linux 有基本了解、想体验 Arch Linux 的开发者,以及希望了解 Arch 安装全过程的 Linux 新手。 前言:为什么选择 Arch Linux?Arch Linux 以”滚动更新”著称——软件包永远是最新的,不存在大版本跨越的升级阵痛。它不预装任何多余的东西,你安装什么就有什么,系统完全由你掌控。代价是:安装门槛比 Ubuntu、Fedora 等发行版要高一些。 好在官方提供了 archinstall 这个交互式安装脚本,极大降低了安装难度,同时不失对安装过程的精确控制。 一、准备工作1.1 下载 ISO 镜像前往 Arch Linux 官网下载最新 ISO: 1https://archlinux.org/download/ 国内推荐用镜像站加速下载: 清华大学镜像站:https://mirrors.tuna.tsinghua.edu.cn/archlinux/iso/latest/ 中科大镜像站:https://mirrors.ustc.edu.cn/archlinux/iso/...
通过 WSL 安装 Arch Linux
通过 WSL 安装 Arch Linux 适用读者:Windows 用户,想在不折腾物理机、不装双系统的情况下,在 Windows 里使用完整的 Arch Linux 开发环境。 前言:WSL 是什么?WSL(Windows Subsystem for Linux)是微软内置于 Windows 10/11 的 Linux 兼容层,让你可以在 Windows 里运行一个真实的 Linux 内核和发行版。WSL2 使用完整的 Linux 内核(而不是模拟层),性能接近原生,文件系统、网络、进程隔离都更完善。 WSL 的优点: 无需重启,Windows 和 Linux 同时运行 可以直接访问 Windows 文件(/mnt/c/ 等) 支持 GUI 应用(WSLg) 开发工具链(git、Python、Node.js、Docker 等)可以原生运行在 Linux 环境 WSL 默认只提供 Ubuntu,但 Arch Linux 可以通过第三方方式安装进来,享受 Arch 的滚动更新和 AUR 生态。 一、启用 WSL21.1 系统要求 Windows 10 版本 20...
安装通用开发工具
安装通用开发工具 适用读者:已完成 Arch Linux 安装(无论实体机还是 WSL),想搭建完整开发环境的读者。本文所有步骤在两种环境下均适用。 前言:我们要装什么?一个典型的全栈开发环境需要: 工具 用途 git 版本控制,几乎所有项目必备 yay AUR 助手,扩展 Arch 软件源 sdkman Java/Maven 版本管理 nvm Node.js 版本管理 uv Python 虚拟环境和包管理(Rust 写的,极快) go Go 语言工具链 docker 容器化运行环境 neovim + LazyVim 高效终端编辑器 kitty GPU 加速终端模拟器(实体机) zip / unzip 压缩解压工具(sdkman 依赖) 一、安装 git(通过 pacman)为什么先用 pacman 安装 git? 后续安装 yay(AUR 助手)需要从 GitHub 克隆代码,而克隆就需要 git。pacman 是 Arch 内置的包管理器,git 在官方源里有,直接装: 1sudo pacman -...
niri 和 Hyprland 配置(DMS)
niri 和 Hyprland 配置(DMS) 适用读者:已在实体机上安装 niri 或 Hyprland 的读者。WSL 用户跳过此篇(WSL 没有独立的 Wayland 显示服务器)。 前言:窗口管理器 ≠ 桌面环境安装完 niri 或 Hyprland 后,你会发现它们只是”窗口管理器”——负责排列、移动窗口。一个完整可用的桌面还需要: 状态栏(显示时间、网络、音量、电量) 应用启动器(搜索和打开应用) 通知系统(消息弹窗) 锁屏程序 壁纸管理 屏幕截图工具 剪贴板管理 把这些一个个手动安装配置,需要几天时间。DMS(Dank Material Shell) 是一个一站式的桌面 Shell,设计目标就是让 niri 和 Hyprland 开箱即用,界面遵循 Material Design 3 风格,外观现代、功能完整。 一、DMS 简介DMS 全称 DankMaterialShell,是基于 Quickshell(一个 QML 驱动的 Shell 框架)和 Go 构建的桌面 Shell。它能替代以下独立工具: 替代的工具 DMS 对应功能 Waybar...
中文环境配置和中文输入法
中文环境配置和中文输入法 适用读者:已完成前四篇配置、需要在 Arch Linux 上使用中文界面和输入法的读者。 前言:中文支持的两个层面在 Linux 上”用中文”包含两件事: 中文显示:系统界面、终端、应用程序能正确显示中文字符(需要正确的 locale 和字体) 中文输入:能通过拼音等方式输入汉字(需要输入法框架) 两者都需要配置,缺一不可。 一、配置系统中文环境(locale)1.1 什么是 locale?locale 是操作系统的本地化设置,决定系统使用的语言、字符编码、日期格式、货币符号等。zh_CN.UTF-8 就是”中国大陆简体中文、UTF-8 编码”的 locale。 1.2 生成中文 locale编辑 /etc/locale.gen,取消注释中文和英文的 UTF-8 行: 1sudo nano /etc/locale.gen 找到并去掉这两行的 #: 12en_US.UTF-8 UTF-8zh_CN.UTF-8 UTF-8 然后生成: 1sudo locale-gen 为什么要同时保留英文 locale? 某些程序在中文 locale 下会产...
LeetCode 1. Two Sum
题目描述给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出和为目标值 target 的那两个整数,并返回它们的数组下标。你可以假设每种输入只会对应一个答案,并且你不能使用两次相同的元素。 解题思路本题要求在一个数组中找出两个和为 target 的数,并返回它们的下标。最直观的做法是双重循环遍历,时间复杂度为 O(n²),但这不是最优解。 更高效的做法是使用哈希表。核心思路是:遍历数组,对于每个元素 nums[i],我们计算出它需要的配对值 target - nums[i],然后在哈希表中查找该配对值是否已经出现过。如果出现过,说明我们找到了答案,直接返回两个下标即可;如果没有出现,则将当前元素的值和下标存入哈希表,供后面的元素查找。 这样做的好处是: 每个元素只需要遍历一次,时间复杂度为 O(n) 通过哈希表的 O(1) 查找,快速判断配对值是否存在 一次遍历即可完成查找和存储,简洁高效 复杂度分析 时间复杂度:O(n),其中 n 是数组长度。只需要遍历一次数组,每次查找和插入哈希表都是 O(1)。 空间复杂度:O(n),哈希表中最多存储 n 个元...
LeetCode 1019. Next Greater Node In Linked List
题目描述给定一个长度为 n 的链表,对于列表中的每个节点,查找下一个更大节点的值。返回一个整数数组 answer,其中 answer[i] 是第 i 个节点下一个更大节点的值。如果第 i 个节点没有下一个更大节点的值,设置 answer[i] = 0。 例如:链表 [2,1,5] → 输出 [5,5,0] 节点 2:下一个更大的是 5 节点 1:下一个更大的是 5 节点 5:后面没有更大的,为 0 再如:链表 [2,7,4,3,5] → 输出 [7,0,5,5,0] 解题思路本题是”下一个更大元素”问题的变种,只不过数据结构从数组变成了链表。核心思路依然是单调栈。 整体流程 链表转数组:首先遍历链表,将所有节点的值存入一个 ArrayList 中,这样可以方便地通过下标随机访问。同时记录元素总数 n。 单调递减栈求解:使用一个单调递减栈(存储下标),从左到右遍历数组: 当栈不为空,且当前元素 nums.get(i) 大于栈顶下标对应元素时: 弹出栈顶下标 index,意味着节点 index 找到了下一个更大的值。 设置 answer[index] = nums.get(i...
LeetCode 138. Copy List with Random Pointer
题目描述给你一个长度为 n 的链表,每个节点包含一个额外增加的随机指针 random,该指针可以指向链表中的任何节点或空节点。构造这个链表的深拷贝。深拷贝应该正好由 n 个全新节点组成,其中每个新节点的值都设为其对应的原节点的值。新节点的 next 指针和 random 指针也都应指向新链表中的对应节点,从而使原链表和新链表中的这些指针能够表示相同的链表状态。 解题思路本题的难点在于处理 random 指针。由于 random 指针可以指向链表中的任意节点,在普通遍历中,我们可能还没有创建该目标节点,导致无法直接设置 random 指针。 使用哈希表可以优雅地解决这个问题,具体分为两趟遍历: 第一趟遍历:创建所有新节点,并建立原节点到新节点的映射关系(map<原节点, 新节点>)。此时新节点的 next 和 random 指针暂时为 null。这一步确保了所有节点都已经被创建,后续可以放心地引用它们。 第二趟遍历:再次遍历原链表,通过哈希表查找: 当前新节点的 next 应该指向 map.get(原节点.next)(即原节点 next 对应的新节点) 当前新节点的 ...
LeetCode 1590. Make Sum Divisible by P
题目描述给你一个正整数数组 nums,请你移除最短子数组(可以为空),使得剩余元素的和能被 p 整除。不允许将整个数组都移除。返回你需要移除的最短子数组的长度,如果无法满足题目要求,返回 -1。 例如:nums = [3,1,4,2],p = 6,输出 1。 解释:数组总和为 3+1+4+2=10,10 % 6 = 4。我们需要移除一个和为 4 的子数组。移除子数组 [4](索引 2),剩余元素和 3+1+2=6,能被 6 整除。子数组长度为 1,是最短的。 解题思路核心数学原理设数组总和模 p 的值为 totalSum % p = target: 如果 target == 0,说明整个数组的和已经能被 p 整除,直接返回 0。 否则,我们需要移除一个子数组,使得该子数组的和模 p 等于 target,这样剩余元素的和模 p 就等于 0。 为什么? 因为剩余和 = 总和 - 子数组和。若剩余和能被 p 整除,即 (totalSum - subSum) % p == 0,则 subSum % p == totalSum % p == target。 前缀和 + 哈希表...
LeetCode 1664. Ways to Make a Fair Array
题目描述给你一个整数数组 nums。你需要恰好移除一个元素后,使得剩余元素中,奇数下标元素之和等于偶数下标元素之和。返回满足条件的移除方案数。 例如:nums = [2,1,6,4],输出 1。 解释: 移除下标 0:[1,6,4],偶数下标和 = 1+4=5,奇数下标和 = 6,5 ≠ 6 移除下标 1:[2,6,4],偶数下标和 = 2+4=6,奇数下标和 = 6,6 = 6 ✓ 移除下标 2:[2,1,4],偶数下标和 = 2+4=6,奇数下标和 = 1,6 ≠ 1 移除下标 3:[2,1,6],偶数下标和 = 2+6=8,奇数下标和 = 1,8 ≠ 1只有移除下标 1 满足条件。 解题思路核心思想直接枚举每个元素被移除的情况需要 O(n²)。我们可以用前缀和的思想在 O(n) 时间内解决。 当移除下标 i 的元素后,剩余元素的下标会发生变化: i 之前的元素,其下标奇偶性不变。 i 之后的元素,其下标奇偶性反转(原来的偶数变奇数,奇数变偶...