⭐算法入门⭐《位运算 - 异或》简单01 —— LeetCode 136. 只出现一次的数字
Posted 英雄哪里出来
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了⭐算法入门⭐《位运算 - 异或》简单01 —— LeetCode 136. 只出现一次的数字相关的知识,希望对你有一定的参考价值。
🙉饭不食,水不饮,题必须刷🙉
还不会C语言,和我一起打卡! 🌞《光天化日学C语言》🌞
LeetCode 太难?上简单题! 🧡《C语言入门100例》🧡
LeetCode 太简单?大神盘他! 🌌《夜深人静写算法》🌌
一、题目
1、题目描述
给定一个整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。
样例输入: [ 7 , 7 , 4 , 1 , 2 , 1 , 2 ] [7,7,4,1,2,1,2] [7,7,4,1,2,1,2]
样例输出: 4 4 4
2、基础框架
- c++ 版本给出的基础框架代码如下:
class Solution {
public:
int singleNumber(vector<int>& nums) {
}
};
3、原题链接
二、解题报告
1、思路分析
考虑异或运算符的三个性质:
1)异或满足 结合律;
2)任何两个 相同的数 异或 的结果为 零;
3)任何数 和 零 异或的 结果为 零;
- 原理:我们可以假设所有的数都按照顺序排列好以后,两个相同的数一定是排在一起的,根据异或的性质 1 和 2,将排在一起的数进行结合异或得到的结果就是 ( n − 1 ) 2 \\frac {(n-1)} 2 2(n−1) 个 0 和 一个只出现一次的数,然后根据异或的性质3,将这些数都进行异或后,得到了那个只出现一次的数。
- 实现:将所有的数进行异或即可。
2、时间复杂度
- 线性枚举的时间复杂度为 O ( n ) O(n) O(n),两个数异或的时间复杂度我 O ( 1 ) O(1) O(1),两者为相乘的关系,所以总时间复杂度为 O ( n ) O(n) O(n)。
3、代码详解
class Solution {
public:
int singleNumber(vector<int>& nums) {
int ans = 0;
for(int i = 0; i < nums.size(); ++i) {
ans ^= nums[i]; // (1)
}
return ans;
}
};
-
(
1
)
(1)
(1)
^
是 c++ 中的异或位运算符。 - 更多有关于异或运算符的作用,可以参考这篇文章:☀️光天化日学C语言☀️(16)- 位运算 ^ 的应用。
三、本题小知识
异或运算符的三个性质:
1)异或满足 结合律;
2)任何两个 相同的数 异或 的结果为 零;
3)任何数 和 零 异或的 结果为 零;
以上是关于⭐算法入门⭐《位运算 - 异或》简单01 —— LeetCode 136. 只出现一次的数字的主要内容,如果未能解决你的问题,请参考以下文章
⭐算法入门⭐《位运算 - 位与》简单01 —— LeetCode 509. 2 的幂