2024-12-28:求出出现两次数字的 XOR 值。用go语言,给定一个数组 nums,其中的数字出现的频率要么是一次,要么是两次。 请找出所有出现两次的数字,并计算它们的按位 XOR 值。 如果没
2024-12-28:求出出现两次数字的 XOR 值。用go语言,给定一个数组 nums,其中的数字出现的频率要么是一次,要么是两次。
请找出所有出现两次的数字,并计算它们的按位 XOR 值。
如果没有数字出现两次,则返回 0。
1 <= nums.length <= 50。
1 <= nums[i] <= 50。
nums 中每个数字要么出现过一次,要么出现过两次。
输入:nums = [1,2,2,1]。
输出:3。
解释:
数字 1 和 2 出现过两次。1 XOR 2 == 3 。
答案2024-12-28:
题目来自leetcode3158。
大体步骤如下:
1.初始化变量:
1.1.set
: 用于记录在数组中出现的数字的集合,以位掩码的方式表示。
1.2.setXor
: 用于存储出现两次的数字的按位异或结果。
1.3.totalXor
: 用于存储整个数组所有数字的按位异或结果。
2.遍历输入数组:
2.1.对于数组 nums
中的每个数字 num
:
2.1.1.通过 totalXor
计算当前 num
的异或值。由于异或操作具有可逆性,相同的数字进行异或会抵消,因此在最后得到的 totalXor
将是所有数字的异或结果。
2.1.2.判断 set
中是否已经存在 num
:
2.1.2.1.如果 set
中不包含 num
(即 set
的第 num
位是 0),则需要将其加入 set
,并在 setXor
中进行异或操作,这样 setXor
会记录下当前 num
。
2.1.2.2.更新 set
: 将 set
与 1 << num
进行按位或操作,表示 num
这个数字在集合中已经被记录过。
3.计算出现两次的数字的 XOR 值:
3.1.最终将 setXor
和 totalXor
进行异或操作以获取只在 nums
中出现两次的数字的异或值。这是因为 totalXor
中会包含重复的数字,而 setXor
中的数字在此之前已经异或了,最后得到的结果正好是出现两次的数字的异或。
4.返回结果:
4.1.如果没有数字出现两次,最后会返回 0。
4.2.返回 setXor ^ totalXor
值,即为所有出现两次数字的按位 XOR 值。
总结
-
时间复杂度:这个程序的时间复杂度是 O(n),其中 n 是数组
nums
的长度。因为我们只需遍历数组一次,所有的操作(异或、位操作)都是 O(1) 的常数时间复杂度。 -
空间复杂度:总的额外空间复杂度是 O(1)。虽然我们使用了固定数量的变量(
set
,setXor
,totalXor
),但这些变量的空间需求是常量级别,不受输入大小影响。因此空间复杂度可以认为是 O(1)。
Go完整代码如下:
package main
import "fmt"
func duplicateNumbersXOR(nums []int) int {
set:=0
setXor:=0
totalXor:=0
for _, num := range nums {
totalXor^=num
if set&(1<<num)==0{
setXor^=num
}
set|=1<<num
}
return setXor^totalXor
}
func main() {
// 示例输入
nums := []int{1, 2, 2, 1}
result := duplicateNumbersXOR(nums)
fmt.Println(result) // 输出: 3
}
Rust完整代码如下:
fn duplicate_numbers_xor(nums: &[i64]) -> i64 {
let mut set = 0;
let mut set_xor = 0;
let mut total_xor = 0;
for &num in nums {
total_xor ^= num;
if (set & (1 << num)) == 0 {
set_xor ^= num;
}
set |= 1 << num;
}
set_xor ^ total_xor
}
fn main() {
// 示例输入
let nums = vec![1, 2, 2, 1];
let result = duplicate_numbers_xor(&nums);
println!("{}", result); // 输出: 3
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· AI 智能体引爆开源社区「GitHub 热点速览」
· Manus的开源复刻OpenManus初探
· 写一个简单的SQL生成工具
2023-12-28 文心一言 VS 讯飞星火 VS chatgpt (166)-- 算法导论13.1 6题
2022-12-28 2022-12-28:有n个黑白棋子,它们的一面是黑色,一面是白色, 它们被排成一行,位置0~n-1上。一开始所有的棋子都是黑色向上, 一共有q次操作,每次操作将位置标号在区间[L,R]内的所有棋子翻
2021-12-28 2021-12-28:给定一个二维数组matrix,matrix[i][j] = k代表: 从(i,j)位置可以随意往右跳<=k步,或者从(i,j)位置可以随意往下跳<=k步, 如果matrix[i]
2020-12-28 2020-12-28:java中,生产环境服务器变慢,如何诊断处理?