leetcode之single number
2016-06-12 15:09
309 查看
Question:
Given an array of integers, every element appears three times except for one. Find that single one.
Note:
Your algorithm should have a linear runtime complexity. Could you implement it without using extra memory?
注意:不使用额外的存储空间,线性时间复杂度
analysis:
single number的本质就是用一个数记录每个bit出现的次数!!!
假设1个数 a = 0X11 (0001 0001)出现了2次,那么bit-1 与 bit-5 都出现了两次:
首先,通过异或运算,我们可以计算一个数是出现了基数次还是偶数次,如下:
如何确定一个数是出现了1次还是3次呢?(都是奇数次哦!!!)
发散一下,既然可以用一个数来记录bit是出现了1次还是2次,那么一个bit先出现了2次,然后又出现了一次,加起来就是三次啦!
看如下代码:
Given an array of integers, every element appears three times except for one. Find that single one.
Note:
Your algorithm should have a linear runtime complexity. Could you implement it without using extra memory?
注意:不使用额外的存储空间,线性时间复杂度
analysis:
single number的本质就是用一个数记录每个bit出现的次数!!!
假设1个数 a = 0X11 (0001 0001)出现了2次,那么bit-1 与 bit-5 都出现了两次:
首先,通过异或运算,我们可以计算一个数是出现了基数次还是偶数次,如下:
flag = 0; flag ^= a; // 执行完此语句后 flag ==a!!! flag ^= a; // 再执行一次呢,a第二次出现的时候? flag == 0 !!!
如何确定一个数是出现了1次还是3次呢?(都是奇数次哦!!!)
发散一下,既然可以用一个数来记录bit是出现了1次还是2次,那么一个bit先出现了2次,然后又出现了一次,加起来就是三次啦!
看如下代码:
#include <iostream> using namespace std; int solve(int A[], int len){ int ones_flag =0 ; int twos_flag = 0; int tree_flag = 0; for(int i = 0; i < len ; i++) { int cur = A[i]; // step -1 更新twos_flag // 注意,一定要先更新twos_flag twos_flag |= cur & ones_flag; //step-2 更新 ones_flag ones_flag ^= cur; // step - 3 更新three_flag three_flag = twos_flag&ones_flag; //在出现了2次的基础上,又出现了1次 // step-4 更新 ones_flag 与 twos_flag // 注意 要同时更新哈 // 抹去出现了三次的数的bit ones_flag &= ~three_flag; twos_flag &= ~three_flag; }// end of for return ones_flag; } int main() { int A[] = {10,10,4,10,3,4,4}; int len = 7; cout<<solve(A,len); }
相关文章推荐
- ListView的item点击事件失效,没有响应。
- Hadoop2.4.1 简单的wordCount的MapReduce程序
- WinPcap. 获取本地驱动设备列表
- 按照“规则”拆分字符串
- Javascript面向对象编程一
- 数据库原理(五)--关系数据库标准语言SQL(二)
- [算法][三轴、六轴、九轴传感器算法分析] 1、分享一个三轴加速计matlab动态可视化脚本
- 【linux】/etc/passwd文件
- Protobuf3 + Netty4: 在socket上传输多种类型的protobuf数据
- 大牛胡百敬的博客
- Android中moveTo、lineTo、quadTo、cubicTo、arcTo详解(实例)
- <Flag> 从今天开始使用CSDN做笔记啦
- betterdownload.sh: 42: betterdownload.sh: Syntax error: "(" unexpected
- 数据库原理(四)--关系数据库标准语言SQL(一)
- 交换机与网桥的区别
- Google VR SDK-cardborad 播放vr视频-Android
- ASP.NET MVC 应用程序的安全性
- php测试题
- 【多个客户端同时调用存储过程,防止数据重复】的解决方法
- springMVC 415 (Unsupported Media Type)