ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

codeforces-go 仓库题解:力扣双周赛 160 的十六进制与三十六进制转换问题(concatHex36)

codeforces-go 仓库题解:力扣双周赛 160 的十六进制与三十六进制转换问题(concatHex36) 科学计算【免费下载链接】codeforces-go算法竞赛模板库 by 灵茶山艾府 项目地址https://gitcode.com/GitHub_Trending/co/codeforces-go点击查看免费下载本篇以 leetcode/biweekly/160/a/README.md 为骨架深入讲解力扣双周赛 160 第一题「十六进制与三十六进制转换」的进制拼接思路。文中完整继承并扩充了题解 README 中 Python / Java / C / Go 四种语言的实现并结合 codeforces-go 仓库中的 Go 源码实现、测试样例与测试工具从strconv.FormatInt的底层行为到仓库的自动生成测试链路做源码级剖析。读完本文你将掌握多语言下任意基数进制转换的标准写法理解FormatInt(base)的适用边界并能借助仓库的测试模板复现本题的本地验证过程。题目背景n² 的十六进制串与 n³ 的三十六进制串拼接本题是力扣第 160 场双周赛Biweekly Contest 160的第一题A 题题目名为「Hexadecimal and Hexatrigesimal Conversion」十六进制与三十六进制转换。给定一个整数n需要返回一个字符串它由n²的十六进制base 16表示与n³的三十六进制base 36表示拼接而成且字母部分统一为大写。从仓库目录结构可以确认这道题在 codeforces-go 中的完整存放位置leetcode/biweekly/160/a 下包含四个文件a.goGo 语言的题解实现a_test.go基于仓库测试框架生成的单元测试a.txt测试样例数据输入 期望输出README.md本题题解说明即本文主体来源。例如a.txt 中给出的样例数据为13 A91P1 36 5101000即当n 13时n² 169其十六进制表示为A9n³ 2197其三十六进制表示为1P1拼接并大写后得到A91P1。当n 36时n² 1296的十六进制为510n³ 46656的三十六进制为1000结果即为5101000。核心解法直接借助标准库的进制转换函数这道题的核心在于进制转换 字符串拼接没有任何需要手推的数学性质。三种语言Python、Java、Go都可以用标准库直接完成唯一特殊的是 C其标准库不支持任意的 36 进制输出因此题解给出了一种手写版本。Python 解法numpyimport numpy as np class Solution: def concatHex36(self, n: int) - str: return np.base_repr(n ** 2, base16) np.base_repr(n ** 3, base36)np.base_repr(number, base)可以把整数转换成任意基数的字符串表示base参数可取值 2~36。这里分别把n²转成 16 进制、把n³转成 36 进制后直接拼接。需要注意 numpy 的base_repr输出的字母默认是小写而题目要求大写因此仅用 numpy 时若对大小写敏感还需要额外处理。Java 解法class Solution { public String concatHex36(int n) { String s Integer.toHexString(n * n) Integer.toString(n * n * n, 36); return s.toUpperCase(); } }Java 用Integer.toHexString得到 16 进制串用Integer.toString(int, int radix)的带基数重载得到 36 进制串最后统一toUpperCase()转为大写以满足题目输出要求。Go 解法仓库实际提交版本func concatHex36(n int) string { s : strconv.FormatInt(int64(n*n), 16) strconv.FormatInt(int64(n*n*n), 36) return strings.ToUpper(s) }这正是 a.go 中的实现本体。Go 标准库strconv.FormatInt(i int64, base int)的第二个参数base支持 2 到 36 的任意基数字母使用小写如A9输出为a9因此最后用strings.ToUpper统一转大写。值得注意的一个工程细节FormatInt要求第一个参数是int64而本题的n是int所以源码中做了int64(n*n)的显式转换避免类型不匹配同时n*n与n*n*n在int范围内完成乘法后再转int64。这一写法直接体现了 Go 强类型语言在调用通用工具函数时必须进行类型适配的特点。C 解法手写进制转换// C 只能手写了 class Solution { string base_repr(int v, int base) { string s; while (v 0) { int d v % base; s d 10 ? 0 d : A d - 10; v / base; } ranges::reverse(s); return s; } public: string concatHex36(int n) { return base_repr(n * n, 16) base_repr(n * n * n, 36); } };C 的标准库只提供std::to_chars/std::formatC20或sprintf的有限进制支持无法直接输出 36 进制所以题解采用模基数取余、逆序拼串的经典手写算法每次取v % base得到最低位数字d 10时映射为字符0d否则映射为Ad-10最后用ranges::reverse反转得到正确的高位在前的字符串。这段代码同时演示了任意进制转换的通用原理也是其他语言标准库内部实现的本质。复杂度分析原题解 README 给出的复杂度分析如下时间复杂度$\mathcal{O}(\log n)$。推导依据是n³的 36 进制位数与 $\log_{36}(n^3)$ 成正比即 $\mathcal{O}(\log n^3) \mathcal{O}(3\log n) \mathcal{O}(\log n)$同理n²的 16 进制位数也是 $\mathcal{O}(\log n)$两部分拼接的总长度仍是 $\mathcal{O}(\log n)$因此整个转换过程的时间复杂度为 $\mathcal{O}(\log n)$。空间复杂度$\mathcal{O}(\log n)$因为结果字符串的长度本身为 $\mathcal{O}(\log n)$ 级别。这一分析同样适用于仓库中的 Go 实现FormatInt内部的除法循环次数与结果的数字位数成正比拼接字符串的总长度为两个进制表示的长度之和。仓库中的本地验证链路从样例数据到测试运行codeforces-go 仓库为每一道 LeetCode 题都配套了题解 测试文件 样例数据三件套本题也不例外。三者之间的协作关系如下样例数据文件a.txt每两组有效行构成一个用例1 行输入 1 行期望输出仓库测试框架会按fNumIn fNumOut的规则自动切分。文件末尾的空行仅用于视觉分隔会被trimSpaceAndEmptyLine忽略。测试文件a_test.go由 copypasta/template/leetcode/generator_test.go 自动生成核心调用如下func Test_a(t *testing.T) { if err : testutil.RunLeetCodeFuncWithFile(t, concatHex36, a.txt, 0); err ! nil { t.Fatal(err) } }测试框架leetcode/testutil/leetcode.go 中的RunLeetCodeFuncWithFile负责读取a.txt按每fNumInfNumOut行一组把数据切分为用例再交给RunLeetCodeFuncWithExamples用反射reflect调用被测函数concatHex36逐条与期望输出比对并支持超时检测isTLE与用例定位targetCaseNum例如-1表示最后一个用例。在这个框架下你可以用以下命令在仓库根目录本地运行本题验证go test -v ./leetcode/biweekly/160/a/ -run Test_a如果修改了a.go的实现只需重新运行该测试即可确认结果是否与 a.txt 中的样例一致。这一函数实现 样例数据 反射驱动测试的模式在整个仓库中通用仓库中每周/双周赛目录下的各题如 leetcode/weekly、leetcode/biweekly均遵循同一套约定。深入原理strconv.FormatInt 的进制支持与边界本题 Go 解法的精髓在于strconv.FormatInt的base参数。从 Go 标准库的设计来看base的取值范围为 2 ~ 36超出该范围会返回nil之类的错误串因此 16 与 36 均在合法区间内输出使用小写字母表示 10 ~ 35 的数字a~z所以题解最后统一调用strings.ToUpper转大写对于n 0FormatInt会返回0而非空串边界行为由标准库保证负数会带有-前缀但本题n的取值使得n²、n³均为非负因此无需额外处理。仓库在 leetcode/biweekly/160/README.md 中同时给出了双周赛 160 其余三题的题解链接Q2 网格图 DP、Q3 Dijkstra 最短路、Q4 二分答案 LogTrick它们与本题分属不同的算法专题。本文聚焦的进制转换是竞赛中模拟/实现类题目的典型代表算法思路直观重点在于对各语言标准库工具函数的熟练运用以及边界细节大小写、类型转换的把控。小结本文完整继承了 leetcode/biweekly/160/a/README.md 的核心内容——四种语言的完整实现与复杂度分析并在此基础上结合仓库源码进行了三层扩充其一通过 a.go 展示了 Go 实现的真实代码形态与int64类型转换细节其二通过 a_test.go 与 a.txt 揭示了仓库题解—测试—样例三件套的组织方式其三通过 leetcode/testutil/leetcode.go 说明了RunLeetCodeFuncWithFile驱动的反射式自动测试原理。掌握这些内容后你不仅学会了本题的进制转换写法也能直接复用仓库的测试模板为其他力扣题目搭建本地验证环境。赞分享科学计算【免费下载链接】codeforces-go算法竞赛模板库 by 灵茶山艾府 项目地址https://gitcode.com/GitHub_Trending/co/codeforces-go点击查看免费下载上一篇抖音批量下载工具完整指南90%的人不知道的免费去水印下载法下一篇CANN ops-math 算子 aclnnSumAccumulateNV2接口解析两段式调用、广播求和与源码实现创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表