⭐算法入门⭐《位运算 - 异或》简单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、原题链接

LeetCode 136. 只出现一次的数字

二、解题报告

1、思路分析

考虑异或运算符的三个性质:
  1)异或满足 结合律
  2)任何两个 相同的数 异或 的结果为
  3)任何数 和 异或的 结果为

  • 原理:我们可以假设所有的数都按照顺序排列好以后,两个相同的数一定是排在一起的,根据异或的性质 1 和 2,将排在一起的数进行结合异或得到的结果就是 ( n − 1 ) 2 \\frac {(n-1)} 2 2(n1) 个 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)异或满足 结合律
  2)任何两个 相同的数 异或 的结果为
  3)任何数 和 异或的 结果为


以上是关于⭐算法入门⭐《位运算 - 异或》简单01 —— LeetCode 136. 只出现一次的数字的主要内容,如果未能解决你的问题,请参考以下文章

⭐算法入门⭐《位运算 - 位与》简单01 —— LeetCode 509. 2 的幂

⭐算法入门⭐《位运算 - 位与》简单02 —— LeetCode 191. 位1的个数

计算机中的二进制运算

C++算法——异或运算解决出现次数问题

P6025 线段树(规律+模拟+位运算)

位运算-查找数组中唯一成对的数