今日工作概述今天解决了困扰已久的 Hexo 部署失败问题。整个过程虽然遇到了一些波折,但最终都顺利解决了。 部署问题修复问题现象执行 hexo deploy 时遇到错误: 12FATAL Something's wrong. Maybe you can find the solution here: https://hexo.io/docs/troubleshooting.htmlError: Spawn failed 问题诊断通过逐步排查,发现了问题根源: Git 凭据文件缺失:配置的凭据文件 C:/Users/liuzhigui/.my-credentials 不存在 SSH 密钥问题:虽然有 austoin.id_rsa 私钥,但没有对应的公钥文件 GitHub SSH 连接失败:22 端口被防火墙阻止 解决方案步骤 1:生成新的 SSH 密钥 1ssh-keygen -t ed25519 -C "liuzhigui_2023@qq.com" -f ~/.ssh/id_ed25519 -N "" 生成了新的 ED2551 ...
题目描述LeetCode 1536. 二进制网格的最少交换次数 给定一个 n x n 的二进制网格 grid,每一次操作可选择相邻两行进行交换。要求使网格满足「主对角线以上的格子全部为 0」,返回最少交换次数;若无法满足条件,返回 -1。 核心提示:主对角线指从 (0,0) 到 (n-1,n-1) 的格子,主对角线以上的格子即坐标 (i,j) 中 j > i 的位置,需全部为 0。 解题思路直接操作网格交换行,会涉及大量数组移动,效率低而且逻辑复杂。可以把问题转化为「每行末尾连续 0 的个数」的问题简化计算: 对于第 i 行(0 ≤ i < n),要使主对角线以上全为 0,等价于:第 i 行从第 i+1 列到第 n-1 列(即主对角线以上的列)必须全为 0。也就是说,第 i 行末尾至少需要有 n-1 - i 个连续的 0。 举例说明(n=3): 第 0 行(i=0):主对角线以上是第 1、2 列,需末尾至少 2 个连续 0 第 1 行(i=1):主对角线以上是第 2 列,需末尾至少 1 个连续 0 第 2 行(i=2):主对角线以上无格子,无任何要求 所以就 ...
简单写个 Ping 工具:网络协议入门与 Go 语言实战日常开发和排查网络问题时最常用的命令非 ping 莫属。但 ping 命令的底层到底是怎么工作的?下面就介绍的是用 Go 语言从实现一个简易版的 Ping 工具! 一、 Ping 是什么?有什么用处?ping 是一个计算机网络工具,通常用于测试网络连接的可达性和测量往返时间。在大多数操作系统中,它都是内置的命令行工具。 简单来说,Ping 的工作机制就像日常打招呼:你对着朋友喊一句“喂,听得到吗?”(发送请求),朋友听到后回一句“听到了!”(接收响应)。 Ping 工具主要有以下几个核心用途: 测试主机的可达性:向目标主机发送一个很小的数据包,如果目标主机正常工作且网络畅通,它将回复一个响应数据包。如果没有响应,说明目标可能离线或网络被阻断(比如被防火墙拦截)。 测量往返时间(RTT):Ping 会记录发送请求和收到响应之间的时间差,即往返时间(RTT),通常以毫秒(ms)为单位。这是评估网络延迟的关键指标。 网络故障排除:如果网络不通,通过 Ping 网关、Ping 外部域名等分步测试,可以快速定位故障节点。 监测网络稳定性: ...
前言:文章会介绍 Go 语言 Web 开发的学习路径。直接开始 Go 语言的高并发核心,并深度解剖 Gin 框架的路由与中间件机制,最后通过一个完整的 CRUD 和 Session 管理项目完成实战落地。 一、 Go 的背景与核心竞争力1.1 背景Go 语言是 Google 的三位宗师级人物(Ken Thompson, Rob Pike, Robert Griesemer)于 2007 年设计。它的诞生纯粹是为了解决工程痛点:C++ 的编译速度太慢、依赖管理太乱、对现代多核 CPU 的并发支持太差。 1.2 核心竞争力:为什么是大厂首选? GMP 并发模型:Go 独有的调度器,将成千上万个用户态线程(Goroutine)复用到少量的系统线程上。启动一个协程仅需 2KB 内存,这让单机支撑百万并发成为可能。 开发效率与运行效率的平衡:有 Python 般的简洁语法,同时有 C 的运行性能。 云原生标配:Docker、Kubernetes、Prometheus 全部由 Go 编写。 当然也有缺点,今天在b站上看到go的尴尬地位,不如rust的高效,也没有java般的生态和市场,但g ...
题目描述LeetCode 1689. 十-二进制数的最小数目 如果一个十进制数字不含任何前导零,且每一位上的数字不是 0 就是 1,那么该数字就是一个十-二进制数。例如,101 和 1100 都是十-二进制数,而 112 和 3001 不是。 给你一个表示十进制整数的字符串 n,返回和为 n 的十-二进制数的最少数目。 示例: 输入:n = "32" 输出:3 解释:10 + 11 + 11 = 32 解题思路核心观察要用最少的十-二进制数相加得到 n,关键在于: 十-二进制数的每一位只能是 0 或 1 要得到某一位的数字 d,至少需要 d 个十-二进制数在该位上都是 1 贪心策略答案就是字符串 n 中的最大数字。 原因: 假设 n = "321",最大数字是 3 要得到百位的 3,至少需要 3 个十-二进制数:1xx + 1xx + 1xx 这 3 个数也可以同时满足十位的 2(11x + 11x + 10x)和个位的 1(111 + 110 + 100) 因此最少需要 3 个十-二进制数 示例验证n = "82734& ...
题目描述LeetCode 1680. 连接连续二进制数字 给你一个整数 n,请你将 1 到 n 的二进制表示连接起来,并返回连接结果对应的十进制数字对 10⁹ + 7 取余的结果。 示例: 输入:n = 3 输出:27 解释:二进制表示中,1、2 和 3 分别是 "1"、"10" 和 "11",连接起来是 "11011",对应十进制 27 解题思路核心思想将 1 到 n 的二进制表示依次连接,相当于: 对于每个数字 i,先将当前结果左移 i 的二进制长度位 然后将 i 加到结果中 每次操作后对 10⁹ + 7 取余 位运算技巧 获取二进制长度:使用 bits.Len(uint(i)) 获取数字 i 的二进制位数 左移操作:ans << len 相当于将 ans 乘以 2^len 连接操作:ans << len | i 相当于将 i 追加到 ans 的二进制表示后面 示例演示以 n = 3 为例: i = 1:len = 1,ans = (0 << 1 | 1 ...
1. 不允许出现未被使用的变量Go对代码整洁度有严格要求,如果在函数内部声明了局部变量但未使用,编译器会直接报错 (declared and not used)。全局变量未使用则不会报错。代码: 123456789101112package mainimport "fmt"func main() { var a int = 10 // 报错:a declared but not used // 解决方法 1:使用它 // fmt.Println(a) // 解决方法 2:用空白标识符 _ 忽略(通常用于占位或忽略返回值) _ = a } 2. 不允许出现未被使用的 import引入了未使用的包也会导致编译失败。但有时我们只想执行某个包内部的 init() 初始化函数(例如注册数据库驱动),而不需要直接调用该包的 API,这时可以使用下划线 _ 进行匿名导入。代码: 12345678910package mainimport ( "fmt" _ "net/http/pprof" // 仅执行该包的 ini ...
题目描述LeetCode 1404. 将二进制表示减到 1 的步骤数 给你一个以二进制形式表示的数字 s。请你返回按下述规则将其减少到 1 所需要的步骤数: 如果当前数字为偶数,则将其除以 2 如果当前数字为奇数,则将其加上 1 题目保证你总是可以按上述规则将测试用例变为 1。 解题思路核心观察对于二进制字符串: 偶数:最低位是 0,除以 2 相当于去掉最后一位 奇数:最低位是 1,加 1 会产生进位,需要找到第一个 0 并将其变为 1,之前的所有 1 都变为 0 方法一:直接模拟从后往前遍历二进制字符串: 如果最低位是 0,直接去掉(相当于除以 2) 如果最低位是 1,执行加 1 操作: 从后往前找到第一个 0 将这个 0 变为 1 将这个 0 之后的所有 1 都变为 0 如果没有找到 0(全是 1),则在最前面添加一个 1 代码实现方法一:直接模拟12345678910111213141516171819202122232425262728293031func numSteps(s string) int { steps := 0 bits ...








