Arkime实战指南:从零搭建开源网络回溯分析平台

核心内容摘要

探索CanOpenSTM32:实现智能家居设备高效通信的实战指南
打造基于STM32的开源飞控系统:从硬件设计到算法实现的完整指南

从基础到进阶:AI 在 HR 工作中的典型应用场景梳理

问题描述给定一个非空整数数组除了某个元素只出现一次外其余每个元素都出现两次。

找出那个只出现了一次的元素。

方法一传统HashMap解法思路分析最直观的想法是统计每个数字出现的次数然后找出只出现一次的那个数字。

实现代码class Solution { public int singleNumber(int[] nums) { // 创建HashMap来存储数字及其出现次数 MapInteger, Integer map new HashMap(); // 遍历数组统计每个数字出现的次数 for (int num : nums) { // 如果map中已经包含这个数字 if (map.containsKey(num)) { // 出现次数加1 map.put(num, map.get(num)

; } else { // 第一次出现设为1 map.put(num,

; } } // 遍历map找到出现次数为1的数字 for (Integer key : map.keySet()) { if (map.get(key)

{ return key; } } // 理论上不会执行到这里题目保证有解 return -1; } }复杂度分析时间复杂度O(n)需要遍历数组一次遍历map一次空间复杂度O(n)最坏情况下需要存储n/21个键值对优缺点✅ 思路直观容易理解✅ 适用于更一般的情况如找出出现奇数次/偶数次的数字❌ 需要额外的存储空间❌ 代码相对冗长方法二HashMap改进版思路分析Java 8引入了一些新的API可以让我们的代码更加简洁优雅。

实现代码class Solution { public int singleNumber(int[] nums) { MapInteger, Integer map new HashMap(); // 使用getOrDefault简化代码 for (int num : nums) { // 如果num存在获取当前值加1如果不存在用0加1 map.put(num, map.getOrDefault(num,

0)

; } // 使用entrySet同时获取key和value避免多次查找 for (Map.EntryInteger, Integer entry : map.entrySet()) { if (entry.getValue()

{ return entry.getKey(); } } return -1; } }

关键技术点

getOrDefault方法getOrDefault方法在key存在时返回对应的value不存在时返回指定的默认值这里是0。

entrySet遍历// 使用entrySet只需一次遍历 for (Map.EntryInteger, Integer entry : map.entrySet()) { if (entry.getValue()

{ // 直接获取value return entry.getKey(); // 直接获取key } }优缺点✅ 代码更简洁✅ 使用entrySet提升遍历效率❌ 仍然需要额外的存储空间方法三异或运算的魔法思路分析这是一个需要点数学思维的解法利用了异或运算的几个重要性质任何数和0异或等于它本身a ⊕ 0 a任何数和自身异或等于0a ⊕ a 0异或运算满足交换律和结合律a ⊕ b ⊕ a (a ⊕ a) ⊕ b 0 ⊕ b b实现代码class Solution { public int singleNumber(int[] nums) { int result 0; for (int num : nums) { result ^ num; // 对每个数字进行异或运算 } return result; } }复杂度分析时间复杂度O(n)只需遍历一次数组空间复杂度O(

只使用常数级别的额外空间优缺点✅ 时间复杂度最低✅ 空间复杂度最优✅ 代码极其简洁❌ 需要理解异或运算的特性❌ 仅适用于特定情况其他数字都出现两次三种方法对比特性传统HashMap改进HashMap异或运算时间复杂度O(n)O(n)O(n)空间复杂度O(n)O(n)O(

代码简洁度一般简洁极简通用性高可处理任意次数高可处理任意次数低只适用于两次思维难度低中高拓展思考如果其他数字出现三次只有一个出现一次这时候异或运算就不适用了但可以使用HashMap或位运算的扩展解法。

如果有两个只出现一次的数字这需要更巧妙的位运算技巧可以通过分组异或来解决。

总结这道题目看似简单却蕴含了丰富的算法思想HashMap解法体现了最直接的计数思维是解决频率统计问题的通用方法API优化展示了如何利用语言特性写出更优雅、高效的代码异或解法揭示了数学思维在算法中的强大威力在实际开发中我们通常选择HashMap解法因为它通用且易于理解和维护。

但在面试或竞赛中异或解法往往更受青睐因为它展示了候选人对问题的深入理解。

希望这篇文章能帮助你更好地理解不同的解题思路。

记住没有最好的算法只有最适合场景的算法。

思考题如果题目改为除了一个数字出现一次外其他数字都出现三次你能想到几种解法

每日大赛反差大赛回家-每日大赛反差大赛回家应用

百度百家号客服电话人工服务

123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123 123