ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

LeetCode 1748 Sum of Unique Elements 题解:基于哈希表统计唯一元素之和

LeetCode 1748 Sum of Unique Elements 题解:基于哈希表统计唯一元素之和 LeetCode 1748 Sum of Unique Elements 题解基于哈希表统计唯一元素之和【免费下载链接】LeetCode-Go✅ Solutions to LeetCode by Go, 100% test coverage, runtime beats 100% | LeetCode 题解项目地址: https://gitcode.com/GitHub_Trending/le/LeetCode-Go本篇基于 LeetCode-Go 仓库中 1748.Sum-of-Unique-Elements 题解文档 展开围绕如何统计数组中只出现一次的元素并求和这一核心问题结合仓库内的 Go 实现与测试用例讲解哈希计数思路、复杂度分析与可运行验证方法。读完本文你将掌握该题目的标准解法并能直接在本地复现仓库中的实现与测试。题目Sum of Unique Elements原题地址对应 LeetCode 第 1748 题题目编号与目录名 1748.Sum-of-Unique-Elements 一致。题目描述如下You are given an integer arraynums. The unique elements of an array are the elements that appearexactly oncein the array.Returnthesumof all the unique elements ofnums.即给定一个整数数组nums数组中的唯一元素是指恰好出现一次的元素要求返回所有唯一元素之和。示例输入输出说明nums [1,2,3,2]4唯一元素为[1,3]和为4nums [1,1,1,1,1]0不存在唯一元素和为0nums [1,2,3,4,5]15所有元素均只出现一次和为15约束条件1 nums.length 1001 nums[i] 100约束规模非常小数组最长 100元素取值范围为 1 到 100因此任何线性复杂度的解法都可以轻松通过。题目大意中文题意与英文完全一致给你一个整数数组nums数组中唯一元素是那些只出现恰好一次的元素请你返回nums中唯一元素的和。核心判断标准是频次恰好等于 1而非第一次出现。解题思路哈希表频次统计这是一道简单题思路非常直接共分两趟遍历统计频次遍历nums用哈希表map记录每个元素出现的次数。累加求和再次遍历哈希表将所有频次恰好为 1 的键元素值累加得到最终答案。该思路的关键在于唯一性的判定依赖全局出现次数因此必须先完整扫描一遍数组统计频次再决定每个元素是否参与求和无法通过单趟遍历直接完成。复杂度分析时间复杂度O(n)其中n为nums的长度。两趟遍历分别为O(n)与O(k)k为不同元素的个数k n。空间复杂度O(n)哈希表最多存储n个不同键值。仓库源码实现仓库中该题的实际实现位于 1748. Sum of Unique Elements.go与题解文档给出的代码完全一致package leetcode func sumOfUnique(nums []int) int { freq, res : make(map[int]int), 0 for _, v : range nums { if _, ok : freq[v]; !ok { freq[v] 0 } freq[v] } for k, v : range freq { if v 1 { res k } } return res }逐段拆解如下make(map[int]int)创建频次哈希表res用于累加结果第一段循环if _, ok : freq[v]; !ok { freq[v] 0 }先做键存在性检查保证首次遇到某元素时能正确初始化计数为 0随后freq[v]完成自增。在 Go 中freq[v]对不存在的键会先按零值0初始化再自增因此这两行也可以简化为一行freq[v]仓库中的写法则显式表达了初始化意图可读性更强第二段循环遍历 mapif v 1判定该元素是否恰好出现一次满足条件则把键k元素值累加进res函数返回res即所有唯一元素之和。从源码结构看函数被放在package leetcode包内函数名为小写sumOfUnique属于包内私有函数由同包测试文件直接调用这符合仓库题解 测试的目录组织惯例。测试用例验证仓库为该题配套了完整的单元测试位于 1748. Sum of Unique Elements_test.go遵循仓库统一的题目序号 para/ans 结构体 表格驱动测试风格type question1748 struct { para1748 ans1748 } type para1748 struct { nums []int } type ans1748 struct { one int } func Test_Problem1748(t *testing.T) { qs : []question1748{ {para1748{[]int{1, 2, 3, 2}}, ans1748{4}}, {para1748{[]int{1, 1, 1, 1, 1}}, ans1748{0}}, {para1748{[]int{1, 2, 3, 4, 5}}, ans1748{15}}, } // ... }测试覆盖了题目给出的全部三个示例[1,2,3,2] → 4、[1,1,1,1,1] → 0、[1,2,3,4,5] → 15分别对应部分重复全部重复全不重复三类典型输入恰好覆盖了唯一元素求和问题的三种关键情形。如何运行测试仓库根目录的 gotest.sh 提供了全量测试入口其核心命令为go test -covermodeatomic -coverprofilecoverage.txt ./leetcode/...该脚本一次性对./leetcode/...下所有题解包执行测试并生成单一的原子覆盖率文件coverage.txt便于 CI如 Codecov解析上传。若只想单独验证本题可进入对应目录执行go test -v -run Test_Problem1748当前仓库的 go.mod 声明模块为github.com/halfrost/LeetCode-GoGo 版本为go 1.19直接使用标准库testing与fmt无需额外依赖。进阶优化利用约束条件使用定长数组计数题目约束给出1 nums[i] 100元素取值范围固定且很小。因此除了哈希表还可以使用长度为 101 的定长数组替代 map 完成计数注意此变体并非仓库内现有实现仅作为基于约束条件的思路延伸func sumOfUnique(nums []int) int { var freq [101]int for _, v : range nums { freq[v] } res : 0 for v, c : range freq { if c 1 { res v } } return res }相比 map 版本数组下标即元素值免去了哈希计算与键存在性检查常数开销更小空间复杂度由O(n)降为O(1)固定 101 个槽位。这种用值域换查询的思路在元素取值受限的题目中非常常见可作为理解后续值域计数类题目如频次排序、桶统计的入门铺垫。小结LeetCode 1748 是一道典型的哈希表计数入门题核心是先统计频次再筛选频次为 1 的元素求和。仓库中该题的 题解文档、Go 实现 与 单元测试 三者相互印证实现简洁、测试完整可作为掌握 map 频次统计模板的参考样例。掌握本题后可以顺带练习同仓库中其他基于频次统计的题目进一步体会哈希计数在不同场景下的应用。【免费下载链接】LeetCode-Go✅ Solutions to LeetCode by Go, 100% test coverage, runtime beats 100% | LeetCode 题解项目地址: https://gitcode.com/GitHub_Trending/le/LeetCode-Go创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进