LeetCode-Go 题解 537:复数乘法(Complex Number Multiplication)——字符串解析与公式求解
LeetCode-Go 题解 537复数乘法Complex Number Multiplication——字符串解析与公式求解【免费下载链接】LeetCode-Go✅ Solutions to LeetCode by Go, 100% test coverage, runtime beats 100% | LeetCode 题解项目地址: https://gitcode.com/GitHub_Trending/le/LeetCode-Go本文以 LeetCode-Go 仓库中 leetcode/0537.Complex-Number-Multiplication/README.md 为核心完整讲解第 537 题「复数乘法」的数学原理、Go 语言实现与测试验证。读完本文你将掌握如何把abi形式的字符串解析为实部与虚部、套用复数乘法公式(abi)(cdi) (ac-bd) (adbc)i求解并理解仓库中该题的源码与测试组织方式可直接照搬到同类字符串运算题目中。题目概述给定两个字符串分别表示两个复数要求返回一个字符串表示这两个复数的乘积。根据定义i^2 -1。示例 1输入: 11i, 11i 输出: 02i 解释: (1 i) * (1 i) 1 i^2 2 * i 2i需要转换为 02i 的形式。示例 2输入: 1-1i, 1-1i 输出: 0-2i 解释: (1 - i) * (1 - i) 1 i^2 - 2 * i -2i需要转换为 0-2i 的形式。注意题目约束输入字符串不包含额外的空格输入字符串以abi的形式给出其中整数a和b的取值范围均为[-100, 100]且输出也应当符合这种形式。值得特别注意的是示例 2 中1-1i这种写法题目约定复数统一以abi形式呈现当虚部系数为负数时b前的号保留因此出现1-1i这种正号拼接负号的字符串解析时需要正确处理。数学基础复数乘法公式设两个复数分别为z1 a bi、z2 c di则它们的乘积为(a bi)(c di) ac adi bci bdi² (ac - bd) (ad bc)i 因为 i² -1即乘积实部real ac - bd乘积虚部imag ad bc这一公式是整道题的核心实现上只需做四次整数乘法与一次减法、一次加法不需要任何浮点运算。解题思路这是一道典型的字符串 数学题目整体分两步走解析从abi形式的字符串中提取整数a与b计算与格式化套用复数乘法公式得到实部与虚部再按abi格式拼回字符串输出。题目明确约束了输入格式无空格、a/b在[-100, 100]范围内、总是形如abi这大大简化了解析逻辑——不需要处理括号、科学计数法等复杂形式用字符串分割加整数转换即可完成。源码精读核心实现逐行解析仓库中该题的完整实现位于 537. Complex Number Multiplication.go代码如下package leetcode import ( strconv strings ) func complexNumberMultiply(a string, b string) string { realA, imagA : parse(a) realB, imagB : parse(b) real : realA*realB - imagA*imagB imag : realA*imagB realB*imagA return strconv.Itoa(real) strconv.Itoa(imag) i } func parse(s string) (int, int) { ss : strings.Split(s, ) r, _ : strconv.Atoi(ss[0]) i, _ : strconv.Atoi(ss[1][:len(ss[1])-1]) return r, i }解析函数parseparse负责把单个abi字符串拆成实部、虚部两个整数func parse(s string) (int, int) { ss : strings.Split(s, ) // 以 分割 r, _ : strconv.Atoi(ss[0]) // 实部分割后的第 0 段 i, _ : strconv.Atoi(ss[1][:len(ss[1])-1]) // 虚部第 1 段去掉末尾的 i return r, i }逐点说明strings.Split(s, )例如11i→[1, 1i]1-1i→[1, -1i]。负号是数字串的一部分因此负数系数能原样保留这正是示例 2 能正确解析的原因。ss[1][:len(ss[1])-1]用切片去掉虚部串末尾的字符i。例如1i→1-1i→-1再交给strconv.Atoi转成整数。两个strconv.Atoi的错误返回值均被忽略_。这是基于题目输入保证合法这一前提的务实写法既然格式已由约束保证解析不会失败忽略错误可让代码更紧凑。若要在真实工程中复用建议改为显式处理 error。主函数complexNumberMultiplyfunc complexNumberMultiply(a string, b string) string { realA, imagA : parse(a) realB, imagB : parse(b) real : realA*realB - imagA*imagB // 实部 ac - bd imag : realA*imagB realB*imagA // 虚部 ad bc return strconv.Itoa(real) strconv.Itoa(imag) i }先分别解析两个字符串得到(realA, imagA)与(realB, imagB)对应公式中的(a, b)与(c, d)real : realA*realB - imagA*imagB对应ac - bdimag : realA*imagB realB*imagA对应ad bc等价写法realA*imagB imagA*realB最后用strconv.Itoa将两个整数转回字符串并以连接、以i结尾保证输出严格符合abi格式。由于系数被限定在[-100, 100]乘积的绝对值最大不超过100×100 100×100 20000int类型完全够用不存在溢出风险。边界情况与输出格式要点这类题目最容易在边界格式上失分结合实现分析如下场景输入示例输出实部为 011i, 11i02i必须保留0和虚部为负1-1i, 1-1i0-2i负号出现在之后虚部为 020i, 30i60i要点输出必须始终是abi形式哪怕实部或虚部为 0 也不能省略0或。示例 1 中结果2i必须写成02i就是这个原因负数系数在字符串中天然表现为−1i、-2-3i这类形式解析与拼接时无需特殊转义strconv会自动处理符号本实现不依赖任何复数库或浮点运算纯整数运算保证了结果的精确性。测试用例验证与运行方式仓库中每个题目目录都遵循README.md 解法源码 测试文件的固定结构可在 leetcode 目录下验证。本题的测试文件为 537. Complex Number Multiplication_test.go其用例组织沿用了本仓库的通用模式——用para537/ans537结构体封装输入输出对再通过question537聚合type para537 struct { a string b string } type ans537 struct { one string } func Test_Problem537(t *testing.T) { qs : []question537{ { para537{11i, 11i}, ans537{02i}, }, { para537{1-1i, 1-1i}, ans537{0-2i}, }, } // 遍历用例并打印实际输出 for _, q : range qs { _, p : q.ans537, q.para537 fmt.Printf(【input】:%v 【output】:%v\n, p, complexNumberMultiply(p.a, p.b)) } }该测试完整覆盖了题目给出的两个官方示例正虚部乘积与负虚部乘积。用例还打印了输入输出便于人工核对例如【input】:{11i 11i} 【output】:02i 【input】:{1-1i 1-1i} 【output】:0-2i在仓库根目录下可以用以下命令单独运行本题测试go test -run Test_Problem537 ./leetcode/0537.Complex-Number-Multiplication/若想验证整个仓库的所有题解并生成覆盖率报告可直接使用仓库根目录下的 gotest.sh 脚本./gotest.sh该脚本通过go test -covermodeatomic -coverprofilecoverage.txt ./leetcode/...对全部题解一次性生成合法的覆盖率文件coverage.txt仓库根目录已存在一份示例产物。复杂度分析设输入字符串的长度为n本题约束下实为常数级但按字符串长度表述更通用时间复杂度O(n)。strings.Split与strconv.Atoi均为线性扫描主函数只做常数次四则运算在本题[-100, 100]的系数约束下实际运行时间可以视为常数空间复杂度O(1)。除最终输出字符串与分割产生的临时子串切片仅 2 个元素外只使用若干整数变量不随输入规模增长。小结LeetCode 537 题「复数乘法」虽然难度不高却涵盖了字符串解析、数学公式应用与格式化输出三个可复用的技能点parse函数演示了按分隔符分割 去尾字符 整数转换的通用解析套路乘法部分验证了复数公式(abi)(cdi) (ac-bd) (adbc)i而输出拼接则强调了题目对abi严格格式的要求。在 LeetCode-Go 仓库中实现源码 与 测试文件 相互印证配合 题目文档 即可完整掌握该题的解法并可将其中的解析模式迁移到其他以字符串形式输入数学对象的题目中。【免费下载链接】LeetCode-Go✅ Solutions to LeetCode by Go, 100% test coverage, runtime beats 100% | LeetCode 题解项目地址: https://gitcode.com/GitHub_Trending/le/LeetCode-Go创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考