当前位置: 首页 > wzjs >正文

网络网站建设办公甘肃搜索引擎网络优化

网络网站建设办公,甘肃搜索引擎网络优化,网站建设与维护banner,做婚纱网站的步骤目录 题目 什么是异或 为什么异或可以解决 过程 正确写法 题目 260. 只出现一次的数字 III - 力扣(LeetCode) 什么是异或 异或(XOR)是一种基本的位运算操作,符号通常表示为 ^。它有以下特点: 定义&…

目录

题目

什么是异或

为什么异或可以解决

过程

正确写法


题目

260. 只出现一次的数字 III - 力扣(LeetCode)

什么是异或

异或(XOR)是一种基本的位运算操作,符号通常表示为 ^。它有以下特点:

定义:

  • 异或是一种二元运算,对两个位(bit)进行操作
  • 当两个位相同时,结果为0
  • 当两个位不同时,结果为1

真值表:

  • 0 ^ 0 = 0
  • 0 ^ 1 = 1
  • 1 ^ 0 = 1
  • 1 ^ 1 = 0

重要性质:

  • 任何数与0异或等于其本身:a ^ 0 = a
  • 任何数与自身异或等于0:a ^ a = 0
  • 异或满足交换律:a ^ b = b ^ a
  • 异或满足结合律:(a ^ b) ^ c = a ^ (b ^ c)
  • 自反性:a ^ b ^ b = a(连续异或同一个数两次,等于没有操作)

为什么异或可以解决

异或可以解决这道题的原因基于以下几个关键特性:

异或的基本性质:

  • 任何数与0异或等于其本身:a ^ 0 = a
  • 任何数与自身异或等于0:a ^ a = 0
  • 异或满足交换律和结合律:a ^ b = b ^ a 和 (a ^ b) ^ c = a ^ (b ^ c)

处理重复元素:

  • 当数组中的元素出现两次时,两个相同的数异或会得到0
  • 例如:[2,3,2,4,3,1,4,7] 异或结果为 2^3^2^4^3^1^4^7 = (2^2)^(3^3)^(4^4)^1^7 = 0^0^0^1^7 = 1^7
  • 这样,所有出现两次的数都会"抵消",只留下出现一次的数

区分两个不同的数:

  • 当我们对整个数组异或后,得到的结果 xorResult = a ^ b(a和b是只出现一次的两个数)
  • xorResult 中为1的位表示a和b在该位上不同(一个为0,一个为1)
  • 我们可以利用这个差异将原数组分成两组,使得:
  • a和b被分到不同组
  • 相同的数一定在同一组(因为它们在所有位上都相同)

为什么xorResult中的1很重要:

  • 如果xorResult的某一位是1,这意味着a和b在这一位上的值不同
  • 一个数是0,另一个数是1
  • 例如,如果a=5 (101),b=3 (011),则xorResult=6 (110)
  • 在这个例子中,第1位和第2位都是1,表示a和b在这两位上不同

利用这个差异分组:

  • 我们选择xorResult中任意一个为1的位(例如最低位的1)
  • 用这个位将原数组分成两组:
  • 第一组:该位为1的所有数字
  • 第二组:该位为0的所有数字

分组策略的有效性:

  • 选择 xorResult 中任意一个为1的位作为分组标准
  • 这保证了a和b会被分到不同组(因为它们在这一位上不同)
  • 而所有出现两次的数,每个数的两个副本都会被分到同一组
  • 这样,每组内部再次进行异或,就变成了找"只出现一次的数字"的简单问题

总结来说,异或运算在这道题中发挥了两个关键作用:

  1. 消除所有出现两次的数,让我们专注于只出现一次的数
  2. 提供了一种区分两个只出现一次的数的方法,使我们能将问题分解

过程

数组 [1, 2, 1, 3, 2, 5]:

步骤1:计算所有元素的异或结果

xorResult = 1 ^ 2 ^ 1 ^ 3 ^ 2 ^ 5= (1 ^ 1) ^ (2 ^ 2) ^ 3 ^ 5   // 相同的数异或得0= 0 ^ 0 ^ 3 ^ 5               // 任何数与0异或等于其本身= 3 ^ 5= 0011 ^ 0101                 // 转为二进制= 0110                        // 结果为6

步骤2:找到xorResult中最低位的1

xorResult = 0110
-xorResult = 取反后+1 = 1001 + 1 = 1010   // 补码运算
diff = xorResult & (-xorResult) = 0110 & 1010 = 0010   // 结果为2

这表示xorResult的第1位(从右往左,从0开始数)是1,即3和5在这一位上不同。

步骤3:根据这一位将数组分成两组

数组:[1, 2, 1, 3, 2, 5]
转为二进制:[0001, 0010, 0001, 0011, 0010, 0101]

检查每个数的第1位:

1 (0001):第1位是0,放入第一组
2 (0010):第1位是1,放入第二组
1 (0001):第1位是0,放入第一组
3 (0011):第1位是1,放入第二组
2 (0010):第1位是1,放入第二组
5 (0101):第1位是0,放入第一组

两组分别为:

  • 第一组(第1位为0):[1, 1, 5]
  • 第二组(第1位为1):[2, 3, 2]

步骤4:分别对两组进行异或

第一组:1 ^ 1 ^ 5 = (1 ^ 1) ^ 5 = 0 ^ 5 = 5
第二组:2 ^ 3 ^ 2 = (2 ^ 2) ^ 3 = 0 ^ 3 = 3

最终结果:[3, 5]

正确写法

class Solution {
public:vector<int> singleNumber(vector<int>& nums) {//第一步进行整体异或long long xorResult = 0;for(int num : nums){xorResult ^= num;}//第二步进行找到最低位1int diff = xorResult & (-xorResult);//第三步判断最低为是否为1进行分组int x = 0, y =0;for(int num : nums){if(num & diff){x ^= num;}else{y ^= num;}}return {x,y};}
};
http://www.dtcms.com/wzjs/467804.html

相关文章:

  • 做网站建设的平台长沙企业关键词优化哪家好
  • 十大最好的网站拓客渠道有哪些
  • 阿里巴巴国际站买家版1元购买域名
  • 为什么我自己做的网站搜索不到seo网站结构优化
  • 上海待遇好的十大国企排名班级优化大师的功能有哪些
  • 室内设计招标网站网店推广的作用
  • 免费下载代码项目的网站最佳搜索引擎磁力王
  • 计算机专业网站建设实训日志商业软文怎么写
  • 如何做好网站建设网络营销的好处
  • 扬州建设银行网站优化网站排名茂名厂商
  • 网站域名转出做一个网站要多少钱
  • 比特币网站做任务网盘搜索
  • 做网站的域名多少钱今日微博热搜榜前十名
  • 成都市建设领域网站咨询电话今晚日本比分预测
  • 博客做公司网站山东网站seo推广优化价格
  • HTML5移动端手机网站开发搜索引擎营销方案例子
  • 青岛做网站皆赴青岛博采seo网站地图
  • html网站建设实例代码汕头seo排名收费
  • 望牛墩镇做网站网站建设公司企业网站
  • 免费seo关键词优化方案网站优化及推广方案
  • wordpress 本地视频seo岗位职责
  • 网站设计就业培训手机网站建设平台
  • 怎么看一个网站是用模板什么做的东莞网络公司代理
  • app网站制作美国传销全网搜索指数查询
  • 西安旅游团报名五日游价格seo公司优化
  • 专业网站建设空间网上接单平台
  • 选择网站的关键词seo是什么简称
  • 网站首页排名百度在线搜索
  • 如何查做的网站排名外贸网络营销
  • 心悦做宠物的网站企业网站营销的优缺点及案例