First. 陈列一下“异或”的一些性质

  异或是一种基于二进制的位运算,用符号XOR或者 ^ 表示,其运算法则是对运算符两侧数的每一个二进制位,同值取0,异值取1。

  它与布尔运算的区别在于,当运算符两侧均为1时,布尔运算的结果为1,异或运算的结果为0。

  性质

  1、交换律

  2、结合律(即(a^b)^c == a^(b^c))

  3、对于任何数x,都有x^x=0,x^0=x

  4、自反性 A ^ B ^ B = A ^  0 = A

   应用

  一、交换两个整数的值而不必用第三个参数
  a = 9;
  b = 11;

  a=a^b; 1001^1011=0010
  b=b^a; 1011^0010=1001
  a=a^b;  0010^1001=1011

  a = 11;
  b = 9;

  二、奇偶判断

  三、判断两个数是否相等 

  a ^ b == 0 ?

  四、格雷码(Gray code)

  五、奇数分频

Second. Leetcode136.只出现一次的数字

     给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。

     说明:

     你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗?

     示例 1:          

 输入: [2,2,1]
 输出: 1

     示例 2:

输入: [4,1,2,1,2]
输出: 4

     代码解答如下:

/*给定一个非空整数数组
除了某个元素只出现一次以外
其余每个元素均出现两次
找出那个只出现了一次的元素
*/
/*----------------------------------------头文件------------------------------------------------------*/
#include <iostream>
#include <vector>
#include <unordered_map>
using namespace std;
/*-------------------------------------使用异或的性质----------------------------------------------*/
class Solution1 {
public:
int singleNumber(vector<int>& nums) {
int res = ;
for (int i = ; i < nums.size(); i++) {
res ^= nums[i]; //使用异或的性质,相同为0,不同为1. 0^X=X X^X=0
}
return res;
}
};
/*-----------------------------------------使用哈希表-----------------------------------------------*/
class Solution2 {
public:
int singleNumber(vector<int>& nums) {
unordered_map<int, int> mm;
for (auto n : nums) {
if (mm.count(n)) {
mm[n]++;
}
else {
mm.emplace(n, );
}
}
for (auto n : nums) {
if (mm[n] == ) {
return n;
}
}
}
};
/*--------------------------------------程序结束----------------------------------------------------*/

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/single-number

Third. Leetcode136.只出现一次的数字Ⅱ

给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现了三次。找出那个只出现了一次的元素。

说明:

你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗?

示例 1:

输入: [2,2,3,2]
输出: 3
示例 2:

输入: [0,1,0,1,0,1,99]
输出: 99

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/single-number-ii

关于异或,或,非运算有以下性质:
0 ^ x = x, x ^ x = 0, x & ~x = 0, x & ~0 = x.

  1. x第一个出现后,经过下面的程序可以得到 a = x, b = 0;

  2. x第二次出现后,经过下面的程序可以得到 a = 0, b = x;

  3. x第三次出现后,经过下面的程序可以得到 a = 0, b = 0;

而只出现一次的数字,经过程序得到a = x, b = 0; 所以最后函数返回值为a.

代码解答如下:

/*
给定一个非空整数数组,
除了某个元素只出现一次以外
其余每个元素均出现了三次
找出那个只出现了一次的元素
*/
#include <iostream>
#include <vector>
using namespace std; class Solution2to1{
public:
int singleNumber(vector<int>& nums) {
int a = , b = ;
for (auto num : nums) {
a = (a^num)&~b;
b = (b^num)&~a;
}
return a;
}
};

Forth. Leetcode136.只出现一次的数字Ⅲ

给定一个整数数组 nums,其中恰好有两个元素只出现一次,其余所有元素均出现两次。 找出只出现一次的那两个元素。

示例 :

输入: [1,2,1,3,2,5]
输出: [3,5]
注意:

结果输出的顺序并不重要,对于上面的例子, [5, 3] 也是正确答案。
你的算法应该具有线性时间复杂度。你能否仅使用常数空间复杂度来实现?

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/single-number-iii

根据异或的性质

如果数组中只有两个数出现次数为1,分别为A和B,其他出现次数为2,那么首先第一步直接对所有数据进行异或,最终会得到A^B的结果!
接着寻找A^B位数为1的地方,通过flag << 1得到,这样就可以将整个数组分成两个部分,第一部含有所有num&flag = 1的数,另一部分含有所有num&flag = 0的数。

巧妙之处:

假如A 1001   B 1101

A^B = 0010

刚开始flag=1;通过while循环和左移<<1可以得到一个值   0010

而0010和上面A  和  B  分别按位与   得到1和0,这样就可以分成两个数组

代码解答:

/*
给定一个整数数组 nums
其中恰好有两个元素只出现一次
其余所有元素均出现两次
找出只出现一次的那两个元素
*/
#include <iostream>
#include <vector>
using namespace std; class Solution3to1 {
public:
vector<int> singleNumber(vector<int>& nums) {
int res = ;
for (auto num : nums) {
res ^= num;
}
int flag = ;
while ((res & flag) == ) {
flag = flag << ;
}
vector<int> result(, );
for (auto num : nums) {
if (num & flag == ) {
result[] ^= num;
}
else {
result[] ^= num;
}
}
return result;
}
};

有问题欢迎留言互相交流学习哈!!!!

LeetCode 136、137、260(只出现一次的数,异或性质及应用)的更多相关文章

  1. Leetcode 136 137 260 SingleNumber I II III

    Leetccode 136 SingleNumber I Given an array of integers, every element appears twice except for one. ...

  2. LeetCode 136. Single Number(只出现一次的数字)

    LeetCode 136. Single Number(只出现一次的数字)

  3. Leetcode SingleNumber I & II & III 136/137/260

    SingleNumber I: 题目链接:https://leetcode-cn.com/problems/single-number/ 题意: 给定一个非空整数数组,除了某个元素只出现一次以外,其余 ...

  4. 136.137.260. Single Number && 位运算

    136. Single Number 意思就是给你一堆数,每个数都出现了两次,只有一个数只出现了一次,找出这个数 位运算(和c艹一样) &:按位与 |:按位或 ^:异或(一样为0,不一样为1) ...

  5. leetcode@ [136/137] Single Number & Single Number II

    https://leetcode.com/problems/single-number/ Given an array of integers, every element appears twice ...

  6. [LeetCode#136, 137]Single Number, Single Number 2

    The question: Single Number Given an array of integers, every element appears twice except for one. ...

  7. leetcode 136 137 Single Number

    题目描述(面试常考题) 借助了异或的思想 class Solution { public: int singleNumber(vector<int>& nums) { ; ; i ...

  8. LeetCode136,137寻找只出现一次的数

    1.题目意思:在数组中,只有一个数字只出现了一次 其他的都出现了两次.找出那个只出现一次的数字. //利用位运算 异或 两个相同的数字异或为0 public int singleNumber(int[ ...

  9. leetcode 136 Single Number, 260 Single Number III

    leetcode 136. Single Number Given an array of integers, every element appears twice except for one. ...

随机推荐

  1. HTML table表头固定

    HTML table表头固定 说说我在最近项目中碰到的css问题吧,作为问题知识集合总结笔记: <!DOCTYPE html> <html> <head> < ...

  2. C语言标准库 常用函数说明

    void *memset(void *str, int c, size_t n) Syntax void *memset(void *str, int c, size_t n) Description ...

  3. python运算符和常用数据类型转换

    运算符 算术运算符 运算符 描述 实例 + 加 两个对象相加 a + b 输出结果 30 - 减 得到负数或是一个数减去另一个数 a - b 输出结果 -10 * 乘 两个数相乘或是返回一个被重复若干 ...

  4. 吴裕雄--天生自然 R语言开发学习:基本数据管理

    #---------------------------------------------------------# # R in Action (2nd ed): Chapter 4 # # Ba ...

  5. 流量全球第4的Reddit到底是一个怎样的网站?

    对于喜欢NBA的我来说,Reddit是经常接触的一个网站.或者说,很多关于NBA的最新消息都是从Reddit上传出来的.值得一提的是,NBA版块在Reddit所有版块中用户活跃程度排名第三,也是体育版 ...

  6. 将js进行到底:node学习3

    node重要API之NET--TCP编程之旅 废话:最近去了一趟上海会了会一个程序员朋友,途径SNH48握手会,说好我就去看看,没想到握手了王诗蒙,掉入巨坑:塞纳河.回来后边听着<春夏秋冬> ...

  7. 高效JS简化版

    详:.doc (颜色标注)2章17条 2018.6.24 星期日 1:24 第 1 章 让自己习惯 JavaScript 第 1 条:了解你使用的 JavaScript 版本 ES5 引入了另一种版本 ...

  8. ES:PB级别的大索引如何设计

    一.单个大索引的缺陷 如果每天亿万+的实时增量数据呢,基于以下几点原因,单个索引是无法满足要求的: 1.存储大小限制维度 单个分片(Shard)实际是 Lucene 的索引,单分片能存储的最大文档数是 ...

  9. mongodb 4.0配置认证模块

    use admin db.createUser({user:"root",pwd:"xxx",roles:[{role:"root",db: ...

  10. 收费的QQ群 改变的不只是所谓的在线教育

    改变的不只是所谓的在线教育" title="收费的QQ群 改变的不只是所谓的在线教育"> 如果说国内互联网企业中最会捞钱的,腾讯敢认第二,恐怕没有其他的企业敢认第一 ...