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
}
2024-12-28:求出出现两次数字的 XOR 值。用go语言,给定一个数组 nums,其中的数字出现的频率要么是一次,要么是两次。 请找出所有出现两次的数字,并计算它们的按位 XOR 值。 如果没的更多相关文章
- 给定两个字符串 s 和 t,它们只包含小写字母。 字符串 t 由字符串 s 随机重排,然后在随机位置添加一个字母。 请找出在 t 中被添加的字母。
给定两个字符串 s 和 t,它们只包含小写字母.字符串 t 由字符串 s 随机重排,然后在随机位置添加一个字母.请找出在 t 中被添加的字母. 示例: 输入: s = "abcd" ...
- [PHP] 算法-请找出带环链表的环的入口结点的PHP实现
给一个链表,若其中包含环,请找出该链表的环的入口结点,否则,输出null 1.找链表倒数第k个结点,输入一个链表,输出该链表中倒数第k个结点.第一个指针走(k-1)步,到达第k个节点,两个指针同时往后 ...
- 给一个链表,若其中包含环,请找出该链表的环的入口结点,否则,输出null。
package algorithms; /* 给一个链表,若其中包含环,请找出该链表的环的入口结点,否则,输出null. public class ListNode { int val; ListNo ...
- 最短路径(给定一个包含非负整数的 m x n 网格,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小。 说明:每次只能向下或者向右移动一步。)
给定一个包含非负整数的 m x n 网格,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小. 说明:每次只能向下或者向右移动一步. 例: 输入: [ [1,3,1], [1,5,1], [ ...
- 【c语言】数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字
题目:数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字. 比如输入一个长度为9的数组{1,2.3.2,2.2.5,4.2}, 因为数组中数字2出现了5次,超过数组的长度的一半,因此输出2 ...
- 给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格。 如果你最多只允许完成一笔交易(即买入和卖出一支股票),设计一个算法来计算你所能获取的最大利润。
给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格. 如果你最多只允许完成一笔交易(即买入和卖出一支股票),设计一个算法来计算你所能获取的最大利润. 注意你不能在买入股票前卖出股票. 示例 ...
- 给定一个数组,求如果排序之后,相邻两数的最大差值,要求时间复杂度为O(N),且要求不能用非基于比较的排序
题目: 给定一个数组,求如果排序之后,相邻两数的最大差值,要求时间复杂度为O(N),且要求不能用非基于比较的排序 public static int maxGap(int nums[]) { if ( ...
- 一个很大的文件,存放了10G个整数的乱序数列,如何用程序找出中位数。
一.梳理审题 一.看清题目: 注意这个题目的量词,这个文件中有10G个整数,而不是这个文件占了10G的内存空间. 二.一些疑问: 在计算机中我们讲的G.M等都是存储容量的概念,但是一般都会在会面加上B ...
- 给定一个数组,求如果排序后,相邻两个元素的最大差值,要求时间复杂度为O(N)
第一种方法: 计数排序后,然后找出两两之间的最大差值 计数排序的时间复杂度是O(N) public class CountSort { public static void main(String[] ...
- 一个数组nums,其中任意两个值等于给定值target,返回这两个值在nums里的位置
package com.java.tencent; import java.lang.reflect.Array; import java.util.Arrays; import java.util. ...
随机推荐
- 《刚刚问世》系列初窥篇-Java+Playwright自动化测试-2-环境准备与搭建-基于Maven(详细教程)
1.简介 上一篇宏哥已经讲解和分享了如何通过引入jar包来搭建Java+Playwright自动化测试环境,这一种是比较老的方法,说白了就是过时的老古董,但是我们必须了解和知道,其实maven搭建无非 ...
- appium-命令行启动appium-server(windows)
首先找到build\lib\main.js所在位置,我用的工具是everything(推荐一波),比windows自带的搜索强太多 执行命令:node C:\Users\Acer\AppData\Ro ...
- 2024Ciscn总决赛Web Writeup
前言 鸽了三个月的复现计划:) ezjs 考点是express引擎解析的一个trick,在高版本的express已经修复,先贴源码 const express = require('express') ...
- C语言(从入门到入土)
1.C语言整体上需要记住的 总体上必须清楚的: 1)程序结构是三种: 顺序结构 , 循环结构 (三个循环结构), 选择结构 (if 和 switch) 2)读程序都要从main()入口, 然后从最上面 ...
- openresty操作mongodb
最近项目中使用openresty,需要通过openresty连接mongo,经过几番折腾终于有了一个结果,现将其记录下来,也感谢模块提供者 使用openresty操作mongo 1.引入第三方的模块 ...
- vscode连接docker时需要为docker容器开设一个映射端口
相关: vscode远程连接远程主机上的docker -- 设置命令 -- -p 5001:5001 设置端口: -p 5001:5001 命令Demo: docker run -it -v /hom ...
- isObject:判断数据是不是引用类型的数据 (例如: arrays, functions, objects, regexes, new Number(0),以及 new String(''))
function isObject(value) { let type = typeof value; return value != null && (type == 'object ...
- 手搓党分享:用Air700E开发板+毫米波雷达,搓一个睡眠监测仪!
只能说,看到这个大佬分享的睡眠监测仪,手上的手环瞬间不香了... 用Air700E开发板+毫米波雷达,手搓一个开箱即用的睡眠监测仪,不花冤枉钱! 一.项目原理及硬件制作 毫米波是指频率范围从30- ...
- delphi Image32 变形控制
先看动画: 代码: 1 unit uFrmTransform; 2 3 interface 4 5 uses 6 Winapi.Windows, Winapi.Messages, System.Sys ...
- RL 基础 | 如何复现 PPO,以及一些踩坑经历
最近在复现 PPO 跑 MiniGrid,记录一下- 这里跑的环境是 Empty-5x5 和 8x8,都是简单环境,主要验证 PPO 实现是否正确. 01 Proximal policy Optimi ...