SingleNumber I:

题目链接:https://leetcode-cn.com/problems/single-number/

题意:

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

  说明:

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

  示例 1:

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

  示例 2:

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

分析:

  利用异或(xor)运算,两个相同的数异或为0

代码如下:

 class Solution {
public:
int singleNumber(int A[], int n) {
int ans = ;
for(int i = ; i < n; ++i) {
ans ^= A[i];
}
return ans;
}
};

SingleNumber II:

题目链接:https://leetcode-cn.com/problems/single-number-ii/

借鉴:https://www.cnblogs.com/grandyang/p/4263927.html

题意:

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

说明:

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

示例 1:

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

示例 2:

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

分析1:

  与第一题的不同是这里相同的数出现了3次,如果能定义一种3进制异或运算,就可以以第一题的方式解出这道题了。

代码如下:

 class Solution {
public:
int singleNumber(vector<int>& nums) {
int res = ;
for (int i = ; i < ; ++i) {
int sum = ;
for (int j = ; j < nums.size(); ++j) {
// 取nums[j]的第i位值,然后加起来
sum += (nums[j] >> i) & ;
}
// sum目前的有进位相加的结果,模3以后就是无进位相加的结果
res |= (sum % ) << i;
}
return res;
}
};

分析2:

  还有一种解法,思路很相似,用3个整数来表示INT的各位的出现次数情况,one表示出现了1次,two表示出现了2次。当出现3次的时候该位清零。最后答案就是one的值。

  1. ones   代表第ith 位只出现一次的掩码变量
  2. twos  代表第ith 位只出现两次次的掩码变量
  3. threes  代表第ith 位只出现三次的掩码变量

代码如下:

 class Solution {
public:
int singleNumber(vector<int>& nums) {
int one = , two = , three = ;
for (int i = ; i < nums.size(); ++i) {
// one & nums[i]的结果某一位上为1意味着这一位在上一轮出现过一次,在这一轮又出现过一次,那么也就意味着出现了两次
// two此时包含所有出现过2次和3次的
two |= one & nums[i];
// one的某一位为1,表示之前出现过1次。如果nums[i]对应位为0,one的某一位没有变化;如果nums[i]对应位为1,one的某一位变为0,表示这一位出现2次了。
// one的某一位为0,表示之前出现过0次或2次。如果nums[i]对应位为0,one的某一位没有变化;如果nums[i]对应位为1,one的某一位变为1,表示这一位出现过1次或3次。
// one此时包含所有出现过1次和3次的
one ^= nums[i];
three = one & two;
// 消掉3次的
one &= ~three;
two &= ~three;
}
return one;
}
};

分析3:

  和分析2一样,不过这次只需要2个变量。

  1. ones   代表第ith 位只出现一次的掩码变量
  2. twos  代表第ith 位只出现两次次的掩码变量

ones[i]原:ones第i位二进制位原来的值

twos[i]原:twos第i位二进制位原来的值

x[i]:所要异或的数的第i位二进制位的值

ones[i]:ones第i位二进制位异或后的值

ones[i]:ones第i位二进制位异或后的值

ones[i]原 twos[i]原 x[i] ones[i] twos[i]
0 0 0 0 0
0 1 0 0 1
1 0 0 1 0
1 1 0 x x
0 0 1 1 0
0 1 1 0 0
1 0 1 0 1
1 1 1 x x
ones的韦恩图
x\ones原twos原 00 01 10 11
0 0 0 1 x
1 1 0 0 x
twos的韦恩图
x\onestwos原 00 01 10 11
0 0 1 0 x
1 1 0 0 x

得到公式为:

ones = (ones ^ x) & ~twos;
twos = (twos ^ x) & ~ones;

代码如下:

 class Solution {
public:
int singleNumber(vector<int>& nums) {
int twos = , ones = ;
for (int i = ; i < nums.size(); ++i) {
// ones ^ nums[i]后ones的某一位1可能表示原来出现过0次,也可能表示原来出现过2次
// & ~twos表示把原来出现过2次的部分删掉
ones = (ones ^ nums[i]) & ~twos;
// twos ^ nums[i]后twos的某一位1可能表示目前出现过2次,也可能表示目前出现过1次
// & ~ones表示把目前出现过1次的部分删掉
twos = (twos ^ nums[i]) & ~ones;
}
return ones | twos;
}
};

SingleNumber III:

题目链接:https://leetcode-cn.com/problems/single-number-iii/

题意:

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

示例 :

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

注意:

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

分析:

  将所有数异或一遍,那个异或完后一定有某一位是1,这意味着两个数在这一位上不同,因此只要把这一位上为0的数和为1的数分别全部异或一遍就能得到只出现一次的2个元素了。

代码如下:

 class Solution {
public:
vector<int> singleNumber(vector<int>& nums) {
vector<int> ans;
int a = , b = , lowbit = ; for(int i = ; i < (int)nums.size(); ++i) {
lowbit ^= nums[i];
} lowbit = lowbit & (-lowbit);
for(int i = ; i < (int)nums.size(); ++i) {
if(nums[i] & lowbit) a ^= nums[i];
else b ^= nums[i];
} ans.push_back(a);
ans.push_back(b);
return ans;
}
};

Leetcode SingleNumber I & II & III 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. 136.137.260. Single Number && 位运算

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

  3. [LeetCode] Contains Duplicate(II,III)

    Contains Duplicate Given an array of integers, find if the array contains any duplicates. Your funct ...

  4. Leetcode 137. Single Number I/II/III

    Given an array of integers, every element appears twice except for one. Find that single one. 本题利用XO ...

  5. 买卖股票的最佳时机I II III IV

    I 假设有一个数组,它的第i个元素是一支给定的股票在第i天的价格.如果你最多只允许完成一次交易(例如,一次买卖股票),设计一个算法来找出最大利润. II 假设有一个数组,它的第i个元素是一个给定的股票 ...

  6. [LeetCode]singleNumber

    题目:singleNumber Given an array of integers, every element appears twice except for one. Find that si ...

  7. [LeetCode] 216. Combination Sum III 组合之和 III

    Find all possible combinations of k numbers that add up to a number n, given that only numbers from ...

  8. [LeetCode] Palindrome Partitioning II 解题笔记

    Given a string s, partition s such that every substring of the partition is a palindrome. Return the ...

  9. [leetcode]Word Ladder II @ Python

    [leetcode]Word Ladder II @ Python 原题地址:http://oj.leetcode.com/problems/word-ladder-ii/ 参考文献:http://b ...

随机推荐

  1. springcloud(十五):Spring Cloud 终于按捺不住推出了自己的服务网关 Gateway

    Spring 官方最终还是按捺不住推出了自己的网关组件:Spring Cloud Gateway ,相比之前我们使用的 Zuul(1.x) 它有哪些优势呢?Zuul(1.x) 基于 Servlet,使 ...

  2. ImportError: cannot import name 'Process' from 'multiprocessing'

    from multiprocessing import Process import os def run_proc(name): print 'Run child process %s (%s).. ...

  3. C#释放资源文件dll或exe

    将程序包含的资源文件释放到硬盘上 1.VS2017-新建  winform(窗体应用)命名为 loader 2.在解决方案管理器中,展开项目loader 在 properties 下面,找到[Reso ...

  4. [CQOI2018]交错序列

    嘟嘟嘟 要是求交错序列的个数和就好了,那我一秒就能切. 换成这个,我就不会了. 我一直想枚举1的个数,然后算出在长度为\(n\)的序列里,有多少个合法的序列,然后又觉得这好像是什么插板法,但是每一个盒 ...

  5. 小a与星际探索

    链接:https://ac.nowcoder.com/acm/contest/317/C来源:牛客网 小a正在玩一款星际探索游戏,小a需要驾驶着飞船从11号星球出发前往nn号星球.其中每个星球有一个能 ...

  6. Nginx 反向代理 -- 一路上的坑转载

    个人学习之用转子https://www.cnblogs.com/xjbBill/p/7477825.html 前些天刚过来新公司上班,公司的项目都挺多的,只不过项目都是第三方公司团队开发的,现在本公司 ...

  7. ESP32入门示例 - SD卡Web服务器

    这个是来自ESP32官方示例的改版,官方的示例由于存在一些问题所以我进行了修改原本的示例有点逻辑上的问题,所以进行了一些修改 主要修改有:1.新增SD卡测试部分 复制自官方SD卡示例2.新增一个根目录 ...

  8. ASM problem : ORA-15001: diskgroup "DGROUP1" does not exist or is not mounted ORA-15040: diskgroup is incomplete

    ============================================================= mos中的详细解释: ODA: After Apply ODA 12.2.1 ...

  9. python3 内置函数

    '''iter()和next()'''# lst = [1, 2, 3]# it = iter(lst)# print(it.__next__())# print(it.__next__())# pr ...

  10. vue-electron脚手架

    vue-electron官方文档(中文):https://simulatedgreg.gitbooks.io/electron-vue/content/cnvue-electron官方文档(英文):h ...