[LeetCode] 137. Single Number II 深入浅出算法讲解和代码示例
来源:互联网 发布:运动减肥软件下载 编辑:程序博客网 时间:2024/06/04 19:31
1. 审题
Given an array of integers, every element appears three times except for one, which appears exactly once. Find that single one.
Note:
Your algorithm should have a linear runtime complexity. Could you implement it without using extra memory?
原题链接:https://leetcode.com/problems/single-number-ii/description/
这道题的难点在于,复杂度要求O(n),且不能开辟额外空间。
可以用位运算的思路来解题。
2. 解题及代码分析
public int singleNumber(int[] A) { int ones = 0, twos = 0; for(int i = 0; i < A.length; i++){ ones = (ones ^ A[i]) & ~twos; twos = (twos ^ A[i]) & ~ones; } return ones;}
ones = (ones ^ A[i]) & ~twos; twos = (twos ^ A[i]) & ~ones;ones =0, twos = 0;
ones twos
0011 0
----- A[0]=0011,每位上的1只出现了1次,所以ones=0011
A[0]: 0 0 1 1A[1]:1 0 0 0统计下来:ones twos
----- A[0],A[1]汇总下来,每位上的1出现1次的是两者异或的结果:1011,
A[0]: 0 0 1 1A[1]: 1 0 0 0A[2]: 1 0 0 1统计下来:ones twos0010 1001
----- A[0],A[1],A[2]汇总下来,每位上的1出现1次的是0010,出现2次的是1001。
ones = (ones ^ A[i]) & ~twos;
1. (ones ^ A[i])两个数异或是把两个数各自位上的1、0相减的绝对值。
ones表示历史迭代中各位上出现1的个数,当前A[i]与它异或:
> 每位上两者都是1的,表示历史统计结果ones出现1次、A[i]中又出现1次,则是2次。
> 每位上两者分别为0、1的,纳入ones统计结果。
2. & ~twos ---- 是为了出现3次后清0
&~twos表示与twos的非相与,什么意思呢?(ones ^ A[i])表示历史统计到A[i]为止出现1的个数,假设 = 1100,此时twos=0100,表示在从右向左数第3位上,出现了1次,同时之前也出现了2次(在twos里),即出现了1+2=3次,对于3次的结果需滤除,所以对twos中出现过的,要&~。
3. 拓展
该解题思路可拓展到数列中出现大于三次的情况,如4次、5次、6次.....
这时可适当灵活定义ones、twos、threes....来统计。
- [LeetCode] 137. Single Number II 深入浅出算法讲解和代码示例
- [LeetCode]493. Reverse Pairs 深入浅出算法讲解和代码示例
- [LeetCode]*137.Single Number II
- LeetCode 137. Single Number II
- [Leetcode] 137. Single Number II
- Leetcode 137. Single Number II
- Leetcode - 137. Single Number II
- 【LeetCode】137. Single Number II
- 137. Single Number II LeetCode
- [LeetCode]137. Single Number II
- [LeetCode]137. Single Number II
- LeetCode 137. Single Number II
- LeetCode *** 137. Single Number II
- [LeetCode]137. Single Number II
- leetcode 137. Single Number II
- LeetCode 137. Single Number II
- LeetCode - 137. Single Number II
- 137. Single Number II LeetCode
- sql server查询数据库总数据条数
- 如何在win10 python3.6 Anaconda安装 Tensorflow
- PL/sql与Oracle数据库连接常见问题
- BZOJ 4808 浅谈精准卡时二分图最大独立集
- 文章标题
- [LeetCode] 137. Single Number II 深入浅出算法讲解和代码示例
- Last_Errno: 1594 the master's binary log is corrupted Last_SQL_Errno: 1062
- STM32内部参照电压VREFIN的使用
- Django文档——Model中的ForeignKey,ManyToManyField与OneToOneField
- 数据预处理
- 【Linux文件目录命令】pwd命令
- Java中类与对象(一):实例方法
- 通达OA麦枫版同步考勤机数据是如何实现的?
- Android Studio中 ADB WIFI插件进行无线调试实践