中型电商网站维护费用,十大软件排行榜,wordpress添加视频插件,网络推广属于什么服务目录
136. 只出现一次的数字 - 力扣#xff08;LeetCode#xff09;
解题思路#xff1a;
代码#xff1a;
运行结果#xff1a;
补充 异或的重要性质 136. 只出现一次的数字 - 力扣#xff08;LeetCode#xff09; 给你一个 非空 整数数组 nums #xff0c;除了某…目录
136. 只出现一次的数字 - 力扣LeetCode
解题思路
代码
运行结果
补充 异或的重要性质 136. 只出现一次的数字 - 力扣LeetCode 给你一个 非空 整数数组 nums 除了某个元素只出现一次以外其余每个元素均出现两次。找出那个只出现了一次的元素。 你必须设计并实现线性时间复杂度的算法来解决此问题且该算法只使用常量额外空间。 示例 1 输入nums [2,2,1]
输出1示例 2 输入nums [4,1,2,1,2]
输出4示例 3 输入nums [1]
输出1提示 1 nums.length 3 * 104-3 * 104 nums[i] 3 * 104除了某个元素只出现一次以外其余每个元素均出现两次。 解题思路 异或运算^的性质 异或运算满足交换律和结合律即a^b^c a^(b^c)。对于任何数xx^x0即一个数与自己异或的结果为0。对于任何数xx^0x即一个数与0异或的结果为它本身。 考虑到这些性质让我们看一下代码的执行过程 初始化变量a为0。遍历数组nums中的每个元素 将a与当前元素进行异或操作即a^nums[i]。异或操作会将出现两次的数字消除因为两个相同的数字异或的结果为0。异或操作会将只出现一次的数字留下因为任何数字与0异或的结果为它本身。最终a将保留只出现一次的数字。返回变量a作为结果。 现在让我们通过一个案例来解析这段代码 假设输入数组nums为[2, 4, 2, 1, 4]其中只有数字1只出现一次其他数字都出现了两次。 执行过程如下 初始化变量a为0。遍历数组nums 第一次循环a^2a的值变为2。第二次循环a^4a的值变为6。第三次循环a^2a的值变为4。第四次循环a^1a的值变为5。第五次循环a^4a的值变为1。返回a的值1作为结果。 代码 class Solution {public int singleNumber(int[] nums) {int a0;for(int i0;inums.length;i){a^nums[i];}return a;}
} 运行结果 补充 异或的重要性质 结合律异或运算满足结合律即对于任意三个数a、b和c满足 (a ^ b) ^ c a ^ (b ^ c)。 自反性任何数与自身进行异或运算的结果为0即 a ^ a 0。这是因为异或运算可以看作是无进位相加而相同的位进行异或运算结果为0。 零元素0是异或运算的零元素即对于任何数a满足 a ^ 0 a。这是因为异或运算中任何数与0进行异或运算结果为它本身。 逆元素每个数在异或运算中都有逆元素即对于任何数a存在一个数b满足 a ^ b 0。这意味着可以通过异或运算来撤销一个数的影响。 消除相同元素当数组中有成对出现的相同元素时对整个数组进行异或运算最终结果为0。这是因为相同元素异或的结果为0而异或运算满足交换律和结合律。 这些性质使得异或运算在很多场景下非常有用例如查找只出现一次的数字、判断两个数是否相等、交换两个变量的值等。通过利用这些性质可以简化问题的处理和求解。