)
LeetCode-Go 题解精讲1758 交替二进制字符串的最小操作次数Golang 实现【免费下载链接】LeetCode-Go✅ Solutions to LeetCode by Go, 100% test coverage, runtime beats 100% | LeetCode 题解项目地址: https://gitcode.com/GitHub_Trending/le/LeetCode-Go本篇文章基于当前仓库中 1758 题解文档完整讲解 LeetCode 1758「Minimum Changes To Make Alternating Binary String交替二进制字符串的最小操作次数」的题目定义、中文释义、基于奇偶下标的 O(n) 解法并结合 Go 实现源码 与 表驱动测试用例 做逐行剖析。读完本文你将掌握交替字符串只有两种候选模式、计数一次即可反推另一种的核心套路并能在面试与刷题中快速写出可复用的 Go 解法。题目Minimum Changes To Make Alternating Binary String英文原题You are given a stringsconsisting only of the characters0and1. In one operation, you can change any0to1or vice versa.The string is called alternating if no two adjacent characters are equal. For example, the string010is alternating, while the string0100is not.Returntheminimumnumber of operations needed to makesalternating.示例 1Input: s 0100 Output: 1 Explanation: If you change the last character to 1, s will be 0101, which is alternating.示例 2Input: s 10 Output: 0 Explanation: s is already alternating.示例 3Input: s 1111 Output: 2 Explanation: You need two operations to reach 0101 or 1010.约束条件1 s.length 10^4s[i]要么是0要么是1题目大意中文释义给定一个仅包含字符0和1的字符串s。在一次操作中你可以把任意一个0改成1反之亦然。如果任意两个相邻字符都不相等则称该字符串为交替字符串。例如010是交替的而0100不是。请返回使s变为交替字符串所需的最少操作次数。解题思路利用数组下标奇偶交替性这是一道简单题但解法背后有一个值得记住的数学观察长度为 n 的二进制交替字符串只有两种可能形态。模式 A01010101……即下标i处的期望字符为i % 2模式 B10101010……即下标i处的期望字符为1 - i % 2对于任意一个下标i模式 A 和模式 B 在该位置的期望字符恰好互补一个是0时另一个必是1。因此任何一个位置最多只会与其中一种模式产生冲突两种模式的失配总数之和恒等于字符串长度len(s)。于是求解被压缩为两步只针对模式 A0101…统计失配次数res遍历每个位置若int(s[i]-0) ! i%2说明该位置与模式 A 不符res模式 B1010…的失配次数必然是len(s) - res取两者最小值min(res, len(s)-res)即为答案。该技巧的关键价值在于只需要一次 O(n) 遍历就能同时得出两种模式的最小代价无需分别构造两个目标串再各自比较。复杂度分析时间复杂度O(n)其中 n 为字符串长度仅需一次线性遍历空间复杂度O(1)只使用常数个整型变量。在约束1 s.length 10^4下该解法可以轻松通过评测。Go 实现源码逐行解析仓库中本题的完整实现位于 1758. Minimum Changes To Make Alternating Binary String.go源码如下package leetcode func minOperations(s string) int { res : 0 for i : 0; i len(s); i { if int(s[i]-0) ! i%2 { res } } return min(res, len(s)-res) } func min(a, b int) int { if a b { return b } return a }关键代码逐行说明int(s[i]-0)利用 ASCII 码差值把字节0/1转换为整数0/1。0的 ASCII 码是 481是 49两者相减恰好得到 0 或 1i%2模式 A0101…在下标i处的期望值。例如i 0期望0值 0i 1期望1值 1与模式 A 的字符分布完全一致res当前字符与模式 A 不匹配累计一次改动代价min(res, len(s)-res)res是改成0101…的代价len(s)-res是改成1010…的代价二者取小即全局最小操作数。关于自实现的 min 辅助函数这里特意没有使用 Go 1.21 起才提供的内建min因为仓库根目录 go.mod 声明的最低 Go 版本为go 1.19module github.com/halfrost/LeetCode-Go go 1.19在 Go 1.19 环境下min/max尚不是内建函数因此仓库源码按需在包内自行定义了min(a, b int) int。这也是刷题仓库的常见做法保证解法在低版本 Go 环境中依然可以直接编译运行。测试用例与仓库验证本题的验证数据存放在 1758. Minimum Changes To Make Alternating Binary String_test.go 中采用仓库统一的表驱动table-driven测试结构type question1758 struct { para1758 ans1758 } // para 是参数 // one 代表第一个参数 type para1758 struct { s string } // ans 是答案 // one 代表第一个答案 type ans1758 struct { one int } func Test_Problem1758(t *testing.T) { qs : []question1758{ { para1758{0100}, ans1758{1}, }, { para1758{10}, ans1758{0}, }, { para1758{1111}, ans1758{2}, }, } fmt.Printf(------------------------Leetcode Problem 1758------------------------\n) for _, q : range qs { _, p : q.ans1758, q.para1758 fmt.Printf(【input】:%v 【output】:%v\n, p, minOperations(p.s)) } fmt.Printf(\n\n\n) }三个用例恰好覆盖了三种典型场景输入输出覆盖场景01001常规情况仅末尾一位与交替模式冲突改为0101或1010都只需 1 次100已交替无需任何操作直接返回 011112极端同字符需要 2 次操作变为0101或1010测试文件将每个用例打包成question1758结构para1758存输入、ans1758存期望输出随后遍历调用minOperations(p.s)并打印输入输出方便在go test运行时直接核对结果。如何运行测试在仓库根目录执行以下命令即可运行本题及全部题目的测试go test ./leetcode/...仓库 gotest.sh 中给出了带覆盖率统计的完整测试方式其核心命令为go test -covermodeatomic -coverprofilecoverage.txt ./leetcode/...该脚本会对./leetcode/...下所有包一次性生成合法的覆盖率文件coverage.txt项目描述中声明的 100% 测试覆盖率正是依托这套测试体系。若要单独验证本题可进入题目目录执行go test -v输出中会打印每个用例的【input】与【output】直观验证三种场景的计算结果与官方示例一致。边界情况与延伸思考边界情况推演s长度为 1任意单个字符天然满足相邻字符不相等不存在相邻字符res为 0 或 1min(res, 1-res)恒为 0与直觉一致全 0 / 全 1如示例 3 的1111答案为n/2n 为偶数或(n±1)/2两种模式代价相同取其一即可已经交替如示例 2 的10若s恰好匹配模式 A则res 0min(0, n)返回 0无需操作s长度上限 10^4O(n) 单次遍历 O(1) 空间的实现可以毫秒级完成无需任何剪枝优化。思路可迁移性两种互补模式、数一次反推另一次的套路并不局限于本题凡是目标形态只有两种且二者逐位互补的字符串或序列改造问题都可以先固定一种目标形态统计差异再用总数相减得到另一种形态的代价最终取最小值。掌握这一观察后同类题目的核心难点就从枚举两种方案降级为一次遍历 一次减法。仓库路径速查本题题解文档关联文档Go 实现源码表驱动测试用例项目 go.modGo 1.19解释自实现 min 的原因覆盖率测试脚本 gotest.sh【免费下载链接】LeetCode-Go✅ Solutions to LeetCode by Go, 100% test coverage, runtime beats 100% | LeetCode 题解项目地址: https://gitcode.com/GitHub_Trending/le/LeetCode-Go创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考