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:

chatgpt

题目来自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: 将 set1 << num 进行按位或操作,表示 num 这个数字在集合中已经被记录过。

3.计算出现两次的数字的 XOR 值

3.1.最终将 setXortotalXor 进行异或操作以获取只在 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
}

在这里插入图片描述

posted @   福大大架构师每日一题  阅读(4)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 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中,生产环境服务器变慢,如何诊断处理?
点击右上角即可分享
微信分享提示