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

在这里插入图片描述

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

评论(0

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

全部回复

上滑加载中

设置昵称

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

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

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