2024-12-28:求出出现两次数字的 XOR 值。用go语言,给定一个数组 nums,其中的数字出现的频率要么是一次,要么是

举报
福大大架构师每日一题 发表于 2024/12/28 20:31:38 2024/12/28
【摘要】 2024-12-28:求出出现两次数字的 XOR 值。用go语言,给定一个数组 nums,其中的数字出现的频率要么是一次,要么是两次。请找出所有出现两次的数字,并计算它们的按位 XOR 值。如果没有数字出现两次,则返回 0。1 <= nums.length <= 50。1 <= nums[i] <= 50。nums 中每个数字要么出现过一次,要么出现过两次。输入:nums = [1,2,2,...

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: 将 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
}

在这里插入图片描述

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0)

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。