⭐算法入门⭐《位运算 - 异或》简单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)任何数 和 异或的 结果为


  • 11
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 11
    评论
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

英雄哪里出来

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值