LeetCode——Single Number II
2015-10-28 00:02
447 查看
这道题有两种思路吧,一种是针对这道题的特定思路:
另一种思路更通用,其余元素都出现k次,只有一个元素例外时,可用这种方法:
class Solution { public: int singleNumber(int A[], int n) { int one=0, two=0, three=0; for(int i=0; i<n; i++){ two |= one&A[i]; one^=A[i]; //cout<<one<<endl; three=one&two; one&= ~three; two&= ~three; } return one; } };基本思路是统计各个二进制位上1出现的次数,one变量的位为1代表到当前元素为止,此位上1出现过1次,同理,two变量中的位为1代表此位上的1已经出现两次了,three也是如此。当某位上的1出现三次后,也就是变量three中的此位为1,就把变量one和two清零,重新计算。如此一来,循环结束时,one中1出现过三次的位都被清零了,少于三次的才能保留下来,所以返回one即可。
另一种思路更通用,其余元素都出现k次,只有一个元素例外时,可用这种方法:
class Solution { public: int singleNumber(vector<int> &A) { int bit[32] = {0}; for(int i = 0; i < A.size(); ++i) { for(int j = 0; j < 32; ++j) { bit[j] += A[i]&1; A[i] >>= 1; } } int result = 0; for(int j = 0; j < 32; ++j) { if(bit[j]%3 != 0) { result += 1 << j; } } return result; } };这种方法统计数组元素中每一位(假设一个整数位32bit)为1的次数,除了一个数外其余数都出现k次,那么出现k次的数其每位为1的次数之和必然是k的倍数,如果bit数组中某一位的值不是k的整数倍,说明出现次数不为k的那个数在那一位上的值为1。如此一来,我们就知道那个数在哪些位上为1 ,自然就知道这个数是多少了。
相关文章推荐
- JS模板引擎 :ArtTemplate (2)
- Interface接口的实现
- JDK+Tomcat安装和配置
- windows7下maven的安装及配置 +nexus私服的搭建
- linux shell 编程2 if then else fi 字符串空的判断
- nginx根据域名动态代理
- html5 canvas实现的手机端签字板
- Ubuntu下 JDK 安装
- routejs blueprints rest model url salias 11
- setInterval与setTimeout的区别 nodejs
- ubuntu redis php 安装
- ubuntu14.04 部署JDK+Tomcat+MySQL
- MySQL中文乱码问题和不能存中文问题
- Mysql主从配置,实现读写分离
- Auto Layout 使用心得(五)—— 根据文字、图片自动计算 UITableViewCell
- Android dp2px
- android资讯类软件框架
- ThinkingInJava_6
- 解决PendingIntent参数传递问题
- oracle自动拼接字符创