【LeetCode】逐日一题 2024_10_12 求出出现两次数字的 XOR 值(哈希、模仿)

[复制链接]
发表于 2026-1-11 06:05:54 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
前言

天天和你一起刷 LeetCode 逐日一题~
LeetCode 启动!


标题:求出出现两次数字的 XOR 值


昨天没有更新,由于昨天的标题和前天的逐日一题是千篇划一的,只是同一道标题,增强了数据范围,恰好的是,前天做这道题的时间我就在题解中分析了暴力做法和优化后的 nlogn 做法 . . . 以是昨天就没有直接把文章 CV 之后再发一遍了~
代码与解题思绪

本日的标题比力简单~
标题要求对出现两次的数相互举行异或利用,用哈希计数,出现第二次就异或到 ans 中即可
  1. func duplicateNumbersXOR(nums []int) (ans int) {
  2.     // 哈希计数,出现两次的就异或一下
  3.     cnt := map[int]int{}
  4.     for _, v := range nums {
  5.         cnt[v]++
  6.         if cnt[v] > 1 { // 出现两次
  7.             ans ^= v
  8.         }
  9.     }
  10.     return ans
  11. }
复制代码
有没有更优的解法呢?
已经做到了 O(N) 的时间复杂度,再往下一步就是做到 O(1) 的空间复杂度了。
对于聚集计数相干的标题,另有一种奇妙的方法,通过数字的二进制位来实现一个聚集:
  1. func duplicateNumbersXOR(nums []int) (ans int) {
  2.     vis := 0
  3.     for _, v := range nums {
  4.         if vis >> v & 1 == 1 { // 该位置是 1,代表该数字已经出现过一次,这次是第二次
  5.             ans ^= v // 出现两次的值异或到一起
  6.         } else {
  7.             vis |= 1 << v // 把该值转化成二进制位加入 vis 集合中
  8.         }
  9.     }
  10.     return ans
  11. }
复制代码
天天进步一点点,我们来日诰日不见不散~

   可以和我刷一辈子的逐日一题吗?
一题一题,积累起来就是一辈子。

回复

使用道具 举报

登录后关闭弹窗

登录参与点评抽奖  加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表